6

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

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

那么打算如何回调服务以停止它..

谢谢,

4

3 回答 3

8

所以我想知道我是否需要创建一个活动来停止服务,或者当用户选择通知时我可以直接停止服务,

您不能直接从Notification. 您可以使用具有操作字符串或额外内容或服务看到并触发它调用的东西来启动服务。IntentonStartCommand()stopSelf()

于 2012-06-21T19:58:54.560 回答
2

这个问题已经很老了,但是由于仍然没有代码解决方案,所以我只是分享我的代码作为解决问题的示例:

您不能直接从通知中停止服务。您可以使用具有操作字符串或额外内容的 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 个 pendingIntent:closePendingIntent(停止服务)和 tabPendingIntent(启动 Activity)

@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();

就是这样

于 2020-04-11T10:56:34.420 回答
0

您不能像那样从服务中启动 Acitivty。您可以做的是在 Service 中创建一个对 Activity 的回调,并让回调启动新的活动。但是拥有通知意味着您不必通过服务。单击通知时,您可以启动在提供给通知的 Intent 中指定的活动。这真的很简单。

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

于 2012-06-21T19:53:51.947 回答