添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

如何在应用程序杀死后停止前台服务?

0 人关注

我正在使用带有通知的前台服务。我在主活动的onDestroy方法中通过调用stopForeground和stopService删除了该服务。问题是,当我把我的应用程序从最近的应用程序中删除时,调试会话仍在运行,当我重新启动应用程序时,MyApplication的onCreate方法与Application类的扩展没有调用。

我在这里看到了答案 https://stackoverflow.com/a/53334788/10069542

<service
android:enabled="true"
android:name=".ExampleService"
android:exported="false"
android:stopWithTask="true" />

当我写android:stopWithTask="true "时,它在android OS 9及以下版本中工作正常,但在android OS 10版本中不工作。 奇怪的是,当我写android:stopWithTask="false "时,它在android OS版本10中工作正常,但在任何其他版本中都不工作。

package com.example.myapplication;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.IBinder;
import android.util.Log;
public class MyService extends Service {
private final String  VIDEO_SERVICE_CHANNEL = 
"VIDEO_SERVICE_CHANNEL";
public static final String TAG = "v_call";
@Override
public IBinder onBind(Intent intent) {
    return null;
@Override
public void onCreate() {
    super.onCreate();
    Log.i(TAG, "MyService onCreate()");
    startForeground(1, getMyNotification("Riaz"));
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i(TAG, "MyService onStartCommand()");
    return START_NOT_STICKY;
@Override
public void onTaskRemoved(Intent rootIntent) {
    super.onTaskRemoved(rootIntent);
    Log.i(TAG, "MyService onTaskRemoved()");
    this.stopSelf();
@Override
public void onDestroy() {
    super.onDestroy();
    Log.i(TAG, "MyService onDestroy()");
    this.stopSelf();
@Override
public void onLowMemory() {
    super.onLowMemory();
    Log.i(TAG, "onLowMemory()");
private Notification getMyNotification(String userName){
    NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
        NotificationChannel mChannel = new NotificationChannel(VIDEO_SERVICE_CHANNEL, getApplicationContext().getString(R.string.room_notification_channel_title), NotificationManager.IMPORTANCE_LOW);
        if (notificationManager != null) {
            notificationManager.createNotificationChannel(mChannel);
    Intent intent = new Intent(this, MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    CharSequence title = getApplicationContext().getString(R.string.room_notification_title);
    PendingIntent contentIntent = PendingIntent.getActivity(this,
            0,intent , 0);
    return new Notification.Builder(this,VIDEO_SERVICE_CHANNEL)
            .setContentTitle(title)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentIntent(contentIntent).build();
public class MainActivity extends AppCompatActivity {
Intent mServiceIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
@Override
protected void onStart() {
    super.onStart();
    Log.i(MyService.TAG, "MainActivity onStart()");
    mServiceIntent = new Intent(MainActivity.this, MyService.class);
    startVideoService();
@Override
protected void onDestroy() {
    super.onDestroy();
    Log.i(MyService.TAG, "MainActivity onDestroy()");
    stopService(mServiceIntent);
private void startVideoService() {
    Log.i(MyService.TAG, "startVideoService()");
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        startForegroundService(mServiceIntent);
    } else {
        startService(mServiceIntent);

有什么想法吗?

5 个评论
那答案中提到的 onTaskRemoved 呢?
当我写android:stopWithTask="false "时,onTaskRemoved在所有版本中都被调用,在android OS 10版本中工作正常,但在其他版本中不工作,而当我写android:stopWithTask="true "时,onTaskRemoved在android OS 9及以下版本中不被调用,在android OS 9及以下版本中工作正常,但在android OS 10版本不工作。
然后你检查操作系统的版本,并确保它们都根据版本得到执行。
你的服务中是否返回 START STICKY 。你能公布你的服务代码吗?
我试着用START STICKY和START_NOT_STICKY返回,但没有成功。
java
android
service
android-notifications
foreground-service
Riaz Yousaf
Riaz Yousaf
发布于 2020-04-27
2 个回答
Lucky Les
Lucky Les
发布于 2021-07-09
已采纳
0 人赞同

@Override public void onTaskRemoved(Intent rootIntent) {

    Intent intentz = new Intent(this, MapService.class);
    stopService(intentz);
    super.onTaskRemoved(rootIntent);
    
编辑你现有的答案,而不是作为单独的答案发布更新。
Lucky Les
Lucky Les
发布于 2021-07-09
0 人赞同

我有同样的问题,这样解决了......

@Override
public void onTaskRemoved(Intent rootIntent) {
   Intent intentz = new Intent(this, MapService.class);