如何在android上检测应用程序退出?

时间:2014-06-25 10:44:01

标签: android xamarin xamarin.android

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

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

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

服务代码:

[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;
    }
}

2 个答案:

答案 0 :(得分:13)

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

@Override
public void onTaskRemoved(Intent rootIntent){

    super.onTaskRemoved(rootIntent);
}

例如我曾经有一个运行服务的应用程序。当我杀了app - 服务也死了,但我想让它活着。通过使用onTaskRemoved,我能够安排重新启动服务:

@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);
}

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

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

void     onTaskRemoved(Intent rootIntent)

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

答案 1 :(得分:1)

我的经验表明,大多数应用程序并不真正需要排序的退出回调 你在描述。

Android方式通常运行正常,属于组件级别(Activity,Service ..) 生命周期管理。

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

但是,如果退出回调真的是你想要的,最接近它的可能就是 是创建一个没有onDestroy()函数以外的逻辑的专用服务 并在app启动时激活它而不关闭它!

class ExitListenerService extends Service {
    @Override
    public void onDestroy() {
        super.onDestroy();
        // App exit logic here. Not deterministic!
    }       
}

这种服务的可能性可能是最后一个被回收的组件 操作系统。这应该适用于大多数情况,它对我来说很好。但事实并非如此 100%保证。

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

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

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

并遍历runningApps寻找你自己的。