从android中最近的应用程序中删除应用程序时的回调侦听器

从android中最近的应用程序中删除应用程序时的回调侦听器,android,service,android-service,background-service,Android,Service,Android Service,Background Service,让我直接谈谈我的问题 有一个古老的类似问题: . 在开始之前请先检查一遍 在应用程序完全销毁之前,我必须将一些数据保存到本地数据库。 我对服务的onTaskRemoved()方法有以下问题: onTaskRemoved()方法不会在每次从“最近的应用程序”屏幕停止应用程序(以及服务)时触发 即使每次调用onTaskRemoved(),该方法也不会完全执行。我的意思是,如果方法中有20条语句,那么只执行5条或10条语句,然后方法就会中断。比如,如果我有20个System.out.println()

让我直接谈谈我的问题

有一个古老的类似问题: . 在开始之前请先检查一遍


在应用程序完全销毁之前,我必须将一些数据保存到本地数据库。

我对服务的onTaskRemoved()方法有以下问题:

  • onTaskRemoved()方法不会在每次从“最近的应用程序”屏幕停止应用程序(以及服务)时触发
  • 即使每次调用onTaskRemoved(),该方法也不会完全执行。我的意思是,如果方法中有20条语句,那么只执行5条或10条语句,然后方法就会中断。比如,如果我有20个System.out.println()语句,而不是只打印5个、10个或12个(任意随机数)语句,然后方法就会中断 因此,我可以依靠onTaskRemoved()方法来清理应用程序获取的资源

    这是我的应用程序版本的一个阻塞问题。我已经尝试了所有的技巧。就像在堆栈中至少有一个活动(我称之为GhostActivity)那样,如果应用程序从最近的应用程序屏幕中被杀死,我们可以在onDestroyed()方法中清除该活动。onDestroyed()被调用,但它有与onTaskRemoved()方法完全相同的问题


    几个星期以来我一直在讨论这个问题,这很烦人。如果有人有任何解决方案,请告诉我。

    我终于自己解决了。我使用了服务和报警管理器的组合。每次我想处理强制关闭场景时,我都会启动一个服务,在其中运行一个无限循环。此循环将每隔15秒迭代一次。在循环中,我设置了一个警报,距离当前时间20秒。现在,如果循环的下一次迭代发生,警报将更新,并在新的当前时间后重置为20秒。这样,只有当用户没有通过调用stopService()方法销毁服务时,才会触发警报


    “在应用程序完全销毁之前,我必须将一些数据保存到本地数据库”——数据更改时,您需要保存数据。不要等到进程终止后才尝试保存它。@commonware实际上,当应用程序被终止时,我还需要做一些事情。我提到数据库任务只是为了简化问题。当我们以编程方式更改wific配置时,我需要禁用热点并恢复用户的。还有一些事情要做。因此,如果我能够将数据保存到数据库中,我将能够执行其他任务。“我需要禁用热点并在我们以编程方式更改WifiConfiguration时恢复用户的WifiConfiguration”——那么,也许您一开始就不应该更改这些内容。有很多方法可以终止您的进程,其中许多方法不会导致对应用程序的任何回调。实际上,这是应用程序的核心功能之一。我知道可能还有更多的病例。我已经处理过应用程序在这种情况下的行为,但是从最近的应用程序中删除应用程序是用户有意识的决定,所以这是一个特例。如果我们能处理这个案子,那将非常有帮助。我还尝试了启动清理服务的alarm manager,但由于不能保证onDestroyed方法将被完全执行,这也不起作用。它能听到杀人的瞬间吗?为什么?
    public class MyIntentService extends IntentService {
    
        public MyIntentService() {
            super("My IntentService");
        }
    
        private boolean stopped = false;
        private Thread runningThread;
    
        private static MyIntentService mInstance;
    
        @Override
        public void onCreate() {
            super.onCreate();
            mInstance = MyIntentService.this;
        }
    
        @Override
        public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
            return super.onStartCommand(intent, flags, startId);
        }
    
        @Override
        protected void onHandleIntent(Intent intent) {
            stopped = false;
            runningThread = Thread.currentThread();
    
            while(!this.stopped) {  
    
                Intent intent = new Intent("Your_Custom_Broadcast_Action");
    
                AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
                PendingIntent broadcastIntent = PendingIntent.getBroadcast(WifiService.this, CLEAN_UP_ALARM_REQUEST_CODE,
                                                    intent, PendingIntent.FLAG_UPDATE_CURRENT);
    
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 20000, broadcastIntent);
                } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                    alarmManager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 20000, broadcastIntent);
                } else {
                    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 20000, broadcastIntent);
                }          
                try {
                    Thread.sleep(15000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            mInstance = null;
            if (runningThread != null) {
                runningThread.interrupt();
            }
        }
    
        public void stopService() {
            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            PendingIntent broadcastIntent = PendingIntent.getBroadcast(WifiService.this, CLEAN_UP_ALARM_REQUEST_CODE,
                                                  intent, PendingIntent.FLAG_UPDATE_CURRENT);
            alarmManager.cancel(broadcastIntent);
    
            stopped = true;
            if (runningThread != null)
                runningThread.interrupt();
        }
    
        public static MyIntentService getActiveInstance() {
            return mInstance;
        }
    }