java - 应用程序终止后如何停止前台服务?
问题描述
我正在使用带有通知的前台服务。我通过调用 stopForeground 和 stopService 来删除主要活动 onDestroy 方法中的服务。问题是当我刷我最近的应用程序的应用程序以杀死它时,调试会话仍在运行,当我重新启动应用程序时,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);
}
}}
请问有什么想法吗?
提前致谢
解决方案
@Override public void onTaskRemoved(Intent rootIntent) {
Intent intentz = new Intent(this, MapService.class);
stopService(intentz);
super.onTaskRemoved(rootIntent);
}
推荐阅读
- python-3.x - 从过滤器中排除数字
- c# - 等待一个已经在运行的任务
- amazon-web-services - Amazon Forecast - TARGET_TIME_SERIES 中的额外属性?
- firebase - node_modules\@firebase 和 node_modules\firebase 包有什么区别?
- python - 快速更新垂直线位置
- web-services - 服务未启动(微服务)取决于 intellij 版本
- c++ - Lisp 像 C++ 函数调用 std::tuple 和折叠表达式
- excel - 按列计算其他 3 列之一中的一个条件
- node.js - NestJS:复制资产不适用于 Linux
- azure - 如何获取 RunCommandResult 以确定是否有错误?