[英]How to stop service from its own foreground notification
I have a Service
running.我有一个Service
正在运行。 and in its onStartCommand
I am doing startforeground
to avoid killing by system.在它的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());
}
but after pressing button , PendingIntent
is not working and my activity
is not getting stopped by it.但是按下按钮后, PendingIntent
不起作用,我的activity
也没有被它阻止。
Can someone please tell, what wrong am I doing here or any other solution to stop service from the foreground notification
made by self.有人可以告诉我,我在这里做错了什么或任何其他解决方案来停止自我notification
的前台notification
服务。
Thanks谢谢
Answering my own question for sake of other finders like me.为了像我这样的其他发现者回答我自己的问题。
Problem was in the line below问题出在下面的行中
PendingIntent pStopSelf = PendingIntent.getService(this, 0, stopSelf,0);
This 0 in the end was cause of the problem .这 0 到底是问题的原因。 I have replaced this with PendingIntent.FLAG_CANCEL_CURRENT and it worked now.我已经用 PendingIntent.FLAG_CANCEL_CURRENT 替换了它,现在它可以工作了。
The corrected code is :更正后的代码是:
PendingIntent pStopSelf = PendingIntent.getService(this, 0, stopSelf,PendingIntent.FLAG_CANCEL_CURRENT);
Please check FLAG_CANCEL_CURRENT or FLAG_UPDATE_CURRENT for more explanation.请检查FLAG_CANCEL_CURRENT 或 FLAG_UPDATE_CURRENT以获得更多解释。
The above idea will not work properly.上述想法将无法正常工作。 Service should stop it's thread first, so sometimes You'l see strange behavior.服务应该先停止它的线程,所以有时你会看到奇怪的行为。 You should put some flag inside your loop/computation method and call " return;
" , and than You may stop service by stopself()
or just wait untill it finish itself.您应该在循环/计算方法中放置一些标志并调用“ return;
”,然后您可以通过stopself()
停止服务或等到它自行完成。 If need example I can show.如果需要示例,我可以展示。 So please ask.所以请问。
if u are using the Service then the service can not stop by itself its runs in the background u have to stop that in this code m stoping the service on notification button click it works for me.. Please Try this如果您正在使用该服务,则该服务无法自行停止其在后台运行您必须在此代码中停止该服务 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();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.