如何从自己的前台通知中停止服务
How to stop service from its own foreground notification
我有一个Service
运行。在它的 onStartCommand
中,我正在做 startforeground
以避免被系统杀死。
public int onStartCommand(Intent intent, int flags, int startId) {
if (ACTION_STOP_SERVICE.equals(intent.getAction())) {
Log.d(TAG,"called to cancel service");
manager.cancel(NOTIFCATION_ID);
stopSelf();
}
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentTitle("abc");
builder.setContentText("Press below button to stoP.");
builder.setPriority(NotificationCompat.PRIORITY_HIGH);
builder.setSmallIcon(R.drawable.ic_launcher);
Intent stopSelf = new Intent(this, SameService.class);
stopSelf.setAction(this.ACTION_STOP_SERVICE);
PendingIntent pStopSelf = PendingIntent.getService(this, 0, stopSelf,0);
builder.addAction(R.drawable.ic_launcher, "Stop", pStopSelf);
manager.notify(NOTIFCATION_ID, builder.build());
}
但是按下按钮后,PendingIntent
不工作,我的 activity
也没有被它停止。
有人可以告诉我,我在这里做错了什么或任何其他停止前台服务的解决方案 notification
自己制作的。
谢谢
为了像我这样的其他发现者回答我自己的问题。
问题出在下面这行
PendingIntent pStopSelf = PendingIntent.getService(this, 0, stopSelf,0);
这个 0 最终是问题的原因。
我已将其替换为 PendingIntent.FLAG_CANCEL_CURRENT,现在可以使用了。
更正后的代码是:
PendingIntent pStopSelf = PendingIntent.getService(this, 0, stopSelf,PendingIntent.FLAG_CANCEL_CURRENT);
请检查 FLAG_CANCEL_CURRENT or FLAG_UPDATE_CURRENT 以获得更多说明。
上面的思路是行不通的。服务应该首先停止它的线程,所以有时你会看到奇怪的行为。你应该在你的 loop/computation 方法中放置一些标志并调用 "return;
" ,然后你可以通过 stopself()
停止服务或者等到它自己完成。如果需要示例,我可以展示。所以请问。
如果您正在使用该服务,则该服务无法自行停止它在后台运行,您必须在此代码中停止该服务 m 停止通知按钮上的服务单击它对我有用..请试试这个
public class AlarmSoundService extends Service {
public static final int NOTIFICATION_ID = 1;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(final Intent intent, int flags, int startId) {
if (intent != null) {
if (intent.getAction().equals(Constants.ACTION_START)) {
final Handler handler = new Handler();
Timer timer = new Timer();
TimerTask doAsynchronousTask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
try {
Date date = new Date();
List<Event> list = SharedPref.getInstance(getApplicationContext()).getEvents();
for (int i = 0; i < list.size(); i++) {
Event a = list.get(i);
SimpleDateFormat format = new SimpleDateFormat("MM/dd/yy", Locale.getDefault());
String currentDate = format.format(date);
if (a.getDate().equals(currentDate)) {
date = new Date();
format = new SimpleDateFormat("hh:mm a", Locale.ENGLISH);
if (a.getTime().equals(format.format(date))) {
playAlarmNotification(a.getTitle(), a.getDescription());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
};
timer.schedule(doAsynchronousTask, 0, 1000);
} else if (intent.getAction().equals(Constants.ACTION_STOP)) {
stopForegroundService();
}
}
return START_STICKY;
}
public void playAlarmNotification(String Title, String Description) {
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Intent stopnotificationIntent = new Intent(this, AlarmSoundService.class);
stopnotificationIntent.setAction(Constants.ACTION_STOP);
PendingIntent Intent = PendingIntent.getService(this, 0, stopnotificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "channel_id")
.setSmallIcon(R.drawable.ic_access_time_black_24dp)
.setContentTitle(Title)
.setContentText(Description)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setColor(Color.BLUE)
.setDefaults(Notification.DEFAULT_ALL)
.setFullScreenIntent(pendingIntent, true)
.setAutoCancel(true)
.setContentIntent(pendingIntent)
.addAction(android.R.drawable.ic_media_pause, "Stop", Intent);
Notification notification = builder.build();
if (Build.VERSION.SDK_INT >= 26) {
NotificationChannel channel = new NotificationChannel("channel_id", "background_service", NotificationManager.IMPORTANCE_DEFAULT);
channel.setDescription("hello");
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.createNotificationChannel(channel);
}
startForeground(NOTIFICATION_ID, notification);
}
private void stopForegroundService() {
stopForeground(true);
stopSelf();
}
}
我有一个Service
运行。在它的 onStartCommand
中,我正在做 startforeground
以避免被系统杀死。
public int onStartCommand(Intent intent, int flags, int startId) {
if (ACTION_STOP_SERVICE.equals(intent.getAction())) {
Log.d(TAG,"called to cancel service");
manager.cancel(NOTIFCATION_ID);
stopSelf();
}
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentTitle("abc");
builder.setContentText("Press below button to stoP.");
builder.setPriority(NotificationCompat.PRIORITY_HIGH);
builder.setSmallIcon(R.drawable.ic_launcher);
Intent stopSelf = new Intent(this, SameService.class);
stopSelf.setAction(this.ACTION_STOP_SERVICE);
PendingIntent pStopSelf = PendingIntent.getService(this, 0, stopSelf,0);
builder.addAction(R.drawable.ic_launcher, "Stop", pStopSelf);
manager.notify(NOTIFCATION_ID, builder.build());
}
但是按下按钮后,PendingIntent
不工作,我的 activity
也没有被它停止。
有人可以告诉我,我在这里做错了什么或任何其他停止前台服务的解决方案 notification
自己制作的。
谢谢
为了像我这样的其他发现者回答我自己的问题。
问题出在下面这行
PendingIntent pStopSelf = PendingIntent.getService(this, 0, stopSelf,0);
这个 0 最终是问题的原因。 我已将其替换为 PendingIntent.FLAG_CANCEL_CURRENT,现在可以使用了。
更正后的代码是:
PendingIntent pStopSelf = PendingIntent.getService(this, 0, stopSelf,PendingIntent.FLAG_CANCEL_CURRENT);
请检查 FLAG_CANCEL_CURRENT or FLAG_UPDATE_CURRENT 以获得更多说明。
上面的思路是行不通的。服务应该首先停止它的线程,所以有时你会看到奇怪的行为。你应该在你的 loop/computation 方法中放置一些标志并调用 "return;
" ,然后你可以通过 stopself()
停止服务或者等到它自己完成。如果需要示例,我可以展示。所以请问。
如果您正在使用该服务,则该服务无法自行停止它在后台运行,您必须在此代码中停止该服务 m 停止通知按钮上的服务单击它对我有用..请试试这个
public class AlarmSoundService extends Service {
public static final int NOTIFICATION_ID = 1;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(final Intent intent, int flags, int startId) {
if (intent != null) {
if (intent.getAction().equals(Constants.ACTION_START)) {
final Handler handler = new Handler();
Timer timer = new Timer();
TimerTask doAsynchronousTask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
try {
Date date = new Date();
List<Event> list = SharedPref.getInstance(getApplicationContext()).getEvents();
for (int i = 0; i < list.size(); i++) {
Event a = list.get(i);
SimpleDateFormat format = new SimpleDateFormat("MM/dd/yy", Locale.getDefault());
String currentDate = format.format(date);
if (a.getDate().equals(currentDate)) {
date = new Date();
format = new SimpleDateFormat("hh:mm a", Locale.ENGLISH);
if (a.getTime().equals(format.format(date))) {
playAlarmNotification(a.getTitle(), a.getDescription());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
};
timer.schedule(doAsynchronousTask, 0, 1000);
} else if (intent.getAction().equals(Constants.ACTION_STOP)) {
stopForegroundService();
}
}
return START_STICKY;
}
public void playAlarmNotification(String Title, String Description) {
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Intent stopnotificationIntent = new Intent(this, AlarmSoundService.class);
stopnotificationIntent.setAction(Constants.ACTION_STOP);
PendingIntent Intent = PendingIntent.getService(this, 0, stopnotificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "channel_id")
.setSmallIcon(R.drawable.ic_access_time_black_24dp)
.setContentTitle(Title)
.setContentText(Description)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setColor(Color.BLUE)
.setDefaults(Notification.DEFAULT_ALL)
.setFullScreenIntent(pendingIntent, true)
.setAutoCancel(true)
.setContentIntent(pendingIntent)
.addAction(android.R.drawable.ic_media_pause, "Stop", Intent);
Notification notification = builder.build();
if (Build.VERSION.SDK_INT >= 26) {
NotificationChannel channel = new NotificationChannel("channel_id", "background_service", NotificationManager.IMPORTANCE_DEFAULT);
channel.setDescription("hello");
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.createNotificationChannel(channel);
}
startForeground(NOTIFICATION_ID, notification);
}
private void stopForegroundService() {
stopForeground(true);
stopSelf();
}
}