如果我的应用程序正在运行,我按下主页按钮,应用程序进入后台。 现在如果长按主页按钮并通过从最近的应用程序列表中滑动来杀死应用程序,则不会调用onPause(),onStop()或onDestroy()等事件,而是终止进程。 因此,如果我希望我的服务停止,杀死通知和取消注册听众,我该怎么做? 我阅读了不少文章和博客,但没有得到任何有用的信息,我没有找到任何有关它的文档。
任何帮助,将不胜感激。
提前致谢。
我解决了我的问题。 校验
@MysticMagic适用于服务,取消通知和取消注册听众怎么样?
您可以在onTaskRemoved中取消注册侦听器。 不是吗? 同样用于取消通知
@MysticMagic? 如果我想在应用更新上做同样的事情怎么办?
我刚刚解决了类似的问题。
如果通过从最近的应用程序列表中轻扫应用程序而终止服务,那么您可以执行以下操作。
在Manifest文件中,将标志stopWithTask保留为true for Service。喜欢:
android:name="com.myapp.MyService"
android:stopWithTask="true" />
但正如你所说,你想取消注册听众并停止通知等,我会建议这种方法:
在Manifest文件中,将标志stopWithTask保留为false for Service。喜欢:
android:name="com.myapp.MyService"
android:stopWithTask="false" />
现在在MyService服务中,覆盖方法onTaskRemoved。 (仅当stopWithTask设置为false时才会触发)。
public void onTaskRemoved(Intent rootIntent) {
//unregister listeners
//do any other cleanup if required
//stop service
stopSelf();
}
请参阅我的问题以获取更多详细信息,其中也包含其他部分代码。
希望这可以帮助。
谢谢。想一想这种方法是否可用于识别滑动杀戮。简单的空白服务?
是的@Kiran你可以试试。 :)
@MysticMagic?但是当服务再次启动时onTaskRemoved有时会在onCreate之后调用... stackoverflow.com/questions/32224233/…
@MysticMagic?嗨,有一个问题,我尝试使用你的解决方案,但似乎很长时间的操作,如将数据发送到服务器,分析到谷歌等有时无法完成。难道这个过程在这个方法有机会完全完成之前被杀死了吗?您也在华为设备上试过这种方法吗?似乎onTaskRemoved永远不会在这些设备上被调用。有什么想法吗?
有没有与此相同问题的解决方案:stackoverflow.com/questions/40021274/…
它不稳定stackoverflow.com/questions/45963407/…
所以onTaskRemoved不会被调用(有时只是很少)并且没有删除通知(服务器仍处于活动状态)
我在6.0.1 Android上测试
你好兄弟不为我工作你有任何其他解决方案?没有得到onTaskRemoved方法登录logcat。
@MysticMagic? public void onTaskRemoved(..)方法不能在Android O中调用。在其他操作系统中正常工作但在Android O中遇到问题。
这段代码不适用于oreo。有什么办法吗?
@BineeshPBabu,因为从Android O开始对后台服务有限制 - developer.android.com/about/versions/oreo/background#services。此解决方案不再可行,此服务将在一段时间后由系统停止
谢谢android:stopWithTask="true"对我有用。
找到了一种方法来做到这一点
像这样做一个服务
public class OnClearFromRecentService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("ClearFromRecentService","Service Started");
return START_NOT_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("ClearFromRecentService","Service Destroyed");
}
@Override
public void onTaskRemoved(Intent rootIntent) {
Log.e("ClearFromRecentService","END");
//Code here
stopSelf();
}
}
2)在manifest.xml中注册此服务
3)然后在您的启动活动上启动此服务
startService(new Intent(getBaseContext(), OnClearFromRecentService.class));
现在每当你从android最近清除你的应用程序然后这个方法onTaskRemoved()将执行。
这不会在android O及以上版本中运行
我解决了类似的问题。如果您想要从最近的任务中滑动并在下次启动它时表现得正常,请按照以下步骤操作: -
1)在共享首选项中保存进程ID:
SharedPreferencesUtils.getInstance().putInt(SharedPreferencesUtils.APP_PROCESS_ID, android.os.Process.myPid());
2)从最近的任务清除后从启动器启动应用程序然后执行:
int previousProcessID = mSharedPreferencesUtils.getInt(SharedPreferencesUtils.APP_PROCESS_ID);
int currentProcessID = android.os.Process.myPid();
if ((previousProcessID == currentProcessID)) {
// This ensures application not killed yet either by clearing recent or anyway
} else {
// This ensures application killed either by clearing recent or by anyother means
}
已确认 - 在没有service.onTaskRemoved()的Android 8上使用 - 很好地完成
此解决方案仅检测应用程序是否已重新启动,但您无法检测应用程序被杀死的确切时刻
当您按下主页 - 正在调用您的Activity的onPause和onStop时,所以此时您必须进行所有节省和清理,因为Android平台不会进一步保证onDestroy或任何其他生命周期方法被调用,因此可以在没有任何通知的情况下杀死该进程。
感谢您的建议,但我不想杀死我的通知,服务和监听器,在onPause()和onstop()上,只有当用户退出应用程序即退出时才需要杀死它们。
您无法处理滑动,因为系统只是从内存中删除您的进程而不调用任何回调。
我已经检查过,在用户调用"最近的应用程序"屏幕之前,将始终调用onPause()。因此,您需要在onPause方法中保存所有数据,而不检查isFinishing()。
要检查后退按钮,请使用onBackPressed方法。
我相信这是所有Android版本的唯一安全方法。
@Sergio是的,这是最安全的方法,我在更大规模的应用程序上进行了测试。
在调用onPause()时需要保存数据。
看看这个生命周期图:
Android开发者
你可以看到一个应用程序可以在onPause()或onStop()之后被杀死。
处理您的数据并在onRestart() onCreate()中恢复。
祝好运!
这适用于android 6,7,8,9。
制作一个这样的服务:
public class OnClearFromRecentService extends Service {
@Override public IBinder onBind(Intent intent) {
return null; }
@Override public int onStartCommand(Intent intent, int flags, int
startId) {
Log.d("ClearFromRecentService","Service Started");
return START_NOT_STICKY; }
@Override public void onDestroy() {
super.onDestroy();
Log.d("ClearFromRecentService","Service Destroyed"); }
@Override public void onTaskRemoved(Intent rootIntent) {
Log.e("ClearFromRecentService","END");
//Code here
stopSelf(); } }
2)在manifest.xml中注册此服务:
android:stopWithTask="false" />
3)然后在您的启动活动上启动此服务
startService(new Intent(getBaseContext(),
OnClearFromRecentService.class));