如何通过在Android中刷卡杀死应用程序时处理代码?

How to handle code when app is killed by swiping in android?

如果我的应用程序正在运行,我按下主页按钮,应用程序进入后台。 现在如果长按主页按钮并通过从最近的应用程序列表中滑动来杀死应用程序,则不会调用onPause()onStop()onDestroy()等事件,而是终止进程。 因此,如果我希望我的服务停止,杀死通知和取消注册听众,我该怎么做? 我阅读了不少文章和博客,但没有得到任何有用的信息,我没有找到任何有关它的文档。
任何帮助,将不胜感激。
提前致谢。


我刚刚解决了类似的问题。

如果通过从最近的应用程序列表中轻扫应用程序而终止服务,那么您可以执行以下操作。

在Manifest文件中,将标志stopWithTask保留为true for Service。喜欢:

1
2
3
<service
    android:name="com.myapp.MyService"
    android:stopWithTask="true" />

但正如你所说,你想取消注册听众并停止通知等,我会建议这种方法:

  • 在Manifest文件中,将标志stopWithTask保留为false for Service。喜欢:

    1
    2
    3
    <service
        android:name="com.myapp.MyService"
        android:stopWithTask="false" />
  • 现在在MyService服务中,覆盖方法onTaskRemoved。 (仅当stopWithTask设置为false时才会触发)。

    1
    2
    3
    4
    5
    6
    7
    8
    public void onTaskRemoved(Intent rootIntent) {

        //unregister listeners
        //do any other cleanup if required

        //stop service
        stopSelf();  
    }
  • 请参阅我的问题以获取更多详细信息,其中也包含其他部分代码。

    希望这可以帮助。


    找到了一种方法来做到这一点

    像这样做一个服务

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    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中注册此服务

    1
    <service android:name="com.example.OnClearFromRecentService" android:stopWithTask="false" />

    3)然后在您的启动活动上启动此服务

    1
    startService(new Intent(getBaseContext(), OnClearFromRecentService.class));

    现在每当你从android最近清除你的应用程序然后这个方法onTaskRemoved()将执行。


    我解决了类似的问题。如果您想要从最近的任务中滑动并在下次启动它时表现得正常,请按照以下步骤操作: -

    1)在共享首选项中保存进程ID:

    SharedPreferencesUtils.getInstance().putInt(SharedPreferencesUtils.APP_PROCESS_ID, android.os.Process.myPid());

    2)从最近的任务清除后从启动器启动应用程序然后执行:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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
    }


    当您按下主页 - 正在调用您的Activity的onPauseonStop时,所以此时您必须进行所有节省和清理,因为Android平台不会进一步保证onDestroy或任何其他生命周期方法被调用,因此可以在没有任何通知的情况下杀死该进程。


    您无法处理滑动,因为系统只是从内存中删除您的进程而不调用任何回调。

    我已经检查过,在用户调用"最近的应用程序"屏幕之前,将始终调用onPause()。因此,您需要在onPause方法中保存所有数据,而不检查isFinishing()。

    要检查后退按钮,请使用onBackPressed方法。


    在调用onPause()时需要保存数据。
    看看这个生命周期图:
    Android开发者

    你可以看到一个应用程序可以在onPause()onStop()之后被杀死。

    处理您的数据并在onRestart() onCreate()中恢复。

    祝好运!


    这适用于android 6,7,8,9。

    制作一个这样的服务:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     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中注册此服务:

    1
    2
    <service android:name="com.example.OnClearFromRecentService"
     android:stopWithTask="false" />

    3)然后在您的启动活动上启动此服务

    1
    2
     startService(new Intent(getBaseContext(),
     OnClearFromRecentService.class));