我有一个后台服务,我想在其中显示允许用户停止的通知。
在android SDK文档中,它表示一个活动用于正常启动一个Activity。所以我想知道我是否需要创建一个活动来停止服务,或者我可以在用户选择通知时直接停止服务,
那么打算如何回电服务来阻止它..
谢谢,
答案 0 :(得分:7)
所以我想知道是否需要创建一个活动来停止服务,或者我可以在用户选择通知时直接停止服务,
您无法直接从Notification
停止服务。您可以启动该服务,使用具有操作字符串的Intent
或服务在onStartCommand()
中看到的额外内容或触发器,并触发它调用stopSelf()
。
答案 1 :(得分:1)
这个问题已经很老了,但是由于仍然没有代码的解决方案,我只分享我的代码作为解决问题的示例:
您不能直接从通知中停止服务。您可以 使用具有操作字符串或其他内容的Intent启动服务 或服务在onStartCommand()中看到并触发的内容 调用stopSelf()。
这是正确的解决方案,所以让我们跳入代码(这些代码都在ExampleService类中):
@RequiresApi(Build.VERSION_CODES.O)
private void startForegroundService() {
// create PendingIntend to open MainActivity (this is when the notification gets clicked) //
Intent tabIntent = new Intent(this, MainActivity.class);
tabIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent tabPendingIntent = PendingIntent.getActivity(this, 0, tabIntent, 0);
// create PendingIntend to open ExampleService (this is when the notification BUTTON gets clicked) //
Intent closeIntent = new Intent(this, ExampleService.class);
closeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
closeIntent.putExtra("destroyCode", 666); // this is the important line //
PendingIntent closePendingIntent = PendingIntent.getService(this, 0, closeIntent, 0);
createNotificationChannel(); // this is only the default code to create notification channel. I just outsourced? it //
现在,Intent具有其他数据(“销毁代码”-> 666)。请注意,我们已经创建了2个endingIntents:closePendingIntent(停止服务)和tabPendingIntent(开始活动)
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
// get extras to know if Intent has destroyCode (666)
Bundle extras = intent.getExtras();
if (extras == null) {
// extras is null which means there is no destroyCode (666)
exampleMethod();
} else {
// Intent has destroyCode (666) -> Intent comes from notification -> stop the service and close notification
stopSelf();
}
return START_STICKY;
}
现在,我们有了代码来检查是否存在destroyCode。最后一步是使用按钮创建通知:
// set attributes for notification //
final NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "channelID_2");
Notification notification = builder.setOngoing(true)
.setSmallIcon(R.drawable.example)
.setContentTitle(getText(R.string.notificationTitle))
.setContentText(getText(R.string.notificationText))
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setCategory(NotificationCompat.CATEGORY_MESSAGE)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setContentIntent(tabPendingIntent) //this is when notification is clicked which only opens ExampleActivity
.addAction(R.drawable.example, getString(R.string.notificationButtonText), closePendingIntent) // here is our closePendingIntent with the destroyCode .addAction is "the onClickListener for the notification button"//
.build();
startForeground(2, notification);
在onCreate中,您可以启动服务
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O)
startForegroundService();
else
startForeground(1, new Notification());
// Toast Message that service has started
Toast.makeText(this, R.string.serviceStarted, Toast.LENGTH_SHORT).show();
就这样
答案 2 :(得分:0)
您无法从服务中启动Acitivty。您可以做的是创建对服务中的活动的回调,并让回调开始新的活动。但是通知意味着您不必通过服务。单击通知后,您可以启动在您提供给通知的Intent中指定的活动。这真的很简单。
请阅读有关示例的通知的参考文档。