关于xamarin:如何检测android上的应用程序退出?

How to detect application exit on android?

如何在应用程序退出时执行一些代码? 我想在应用程序退出时删除临时数据。 通过应用程序退出,我的意思是该应用程序在后台运行时没有最小化,并且完全消失了。

我试图使服务在单独的进程中运行,该服务正在检查应用程序进程是否未运行,因此应删除temp文件夹。 使用此方法,由于进程仍以最低优先级运行,因此并不总是删除temp文件夹。

我无法在OnDestroy()中执行此操作。

服务代码:

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
26
27
28
29
30
[Service(Process ="com.lobomonitor")]
[IntentFilter(new string[] {"com.androidgui.ProcessMonitorService" })]
public class ProcessMonitorService : Service
{
    public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
    {
        Thread processThread = new Thread(() =>
                                          {
                                              ActivityManager actManager = (ActivityManager) this.GetSystemService(ActivityService);
                                              while (true)
                                              {
                                                  Thread.Sleep(1000);
                                                  IList<ActivityManager.RunningAppProcessInfo> procList = actManager.RunningAppProcesses;
                                                  procList.Any(i => i.ProcessName.Equals("com.androidgui"));
                                                  if (!procList.Any(i => i.ProcessName.Equals("com.androidgui")))
                                                  {
                                                          FolderManager.Singleton.DeleteTempFolder();
                                                          break;
                                                  }
                                              }
                                          });
        processThread.Start();
        return StartCommandResult.RedeliverIntent;
    }

    public override IBinder OnBind(Intent intent)
    {
        return null;
    }
}


我不知道是否有帮助,但是如果您杀死了您的应用程序,那么在后台调用方法中运行的服务:

1
2
3
4
5
@Override
public void onTaskRemoved(Intent rootIntent){

    super.onTaskRemoved(rootIntent);
}

例如,我曾经有一个运行服务的应用程序。当我杀死应用程序时-服务也死了,但我希望它保持生命。通过使用onTaskRemoved,我可以安排服务重启:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Override
public void onTaskRemoved(Intent rootIntent){
    Intent restartServiceIntent = new Intent(getApplicationContext(), this.getClass());
    restartServiceIntent.setPackage(getPackageName());

    PendingIntent restartServicePendingIntent = PendingIntent.getService(getApplicationContext(), 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT);
    AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
    alarmService.set(
            AlarmManager.ELAPSED_REALTIME,
            SystemClock.elapsedRealtime() + 1000,
            restartServicePendingIntent);

    super.onTaskRemoved(rootIntent);
}

效果是->我正在杀死我的应用程序->服务看到正在删除任务并调用onTaskRemoved->我正计划在1秒钟内重新启动服务->服务死机->一秒钟后它会唤醒->结果:应用程序正在被杀死,我执行了重新启动服务的代码,因此它仍在后台运行(仅在首选项中可见->作为进程的应用程序)

http://developer.android.com/reference/android/app/Service.html

1
void     onTaskRemoved(Intent rootIntent)

如果该服务当前正在运行并且用户已删除该服务的应用程序中的任务,则会调用此方法。


我的经验表明,大多数应用程序实际上并不需要那种退出回调
您正在描述。

通常可以正常工作的Android方法是组件级(活动,服务..)
生命周期管理。

某些应用程序允许激活时的"退出"功能(通过按钮,菜单等)
用户允许,该应用关闭所有打开的组件并基本上关闭。

但是,如果确实要使用退出回调,则可能最接近它
是创建专用服务,除了onDestroy()函数外,没有其他逻辑
并在应用启动时激活它,而无需关闭它!

1
2
3
4
5
6
7
class ExitListenerService extends Service {
    @Override
    public void onDestroy() {
        super.onDestroy();
        // App exit logic here. Not deterministic!
    }      
}

很有可能这样的服务将是最后被回收的组件。
操作系统。在大多数情况下,这应该可行,对我来说效果很好。但这不是
100%保证。

但是..如果您必须拥有防弹解决方案,那么我知道的另一种方法是创建一个对等应用程序,称为"看门狗",它将定期唤醒以检查天气,而不是您的主应用程序
仍在运行,如果没有运行,将激活退出逻辑。

要运行此最后检查,您需要致电

1
  List<RunningAppProcessInfo> runningApps = activityManager.getRunningAppProcesses();

并遍历runningApps寻找自己的应用程序。