从通知中停止后台服务

时间:2012-06-21 19:47:50

标签: android

我有一个后台服务,我想在其中显示允许用户停止的通知。

在android SDK文档中,它表示一个活动用于正常启动一个Activity。所以我想知道我是否需要创建一个活动来停止服务,或者我可以在用户选择通知时直接停止服务,

那么打算如何回电服务来阻止它..

谢谢,

3 个答案:

答案 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中指定的活动。这真的很简单。

请阅读有关示例的通知的参考文档。