Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检测android上的应用程序退出?_Android_Xamarin_Xamarin.android - Fatal编程技术网

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

如何检测android上的应用程序退出?,android,xamarin,xamarin.android,Android,Xamarin,Xamarin.android,如何在应用程序退出时执行一些代码?我想删除应用程序退出时的临时数据。我所说的应用程序退出是指应用程序并没有在后台运行,它完全消失了 我试图使服务在单独的进程中运行,该服务正在检查应用程序进程是否未运行,它应该删除临时文件夹。使用这种方法,临时文件夹并不总是被删除,因为进程仍然以最低优先级运行 我无法在OnDestroy()中执行此操作 服务代码: [Service(Process = "com.lobomonitor")] [IntentFilter(new string[]

如何在应用程序退出时执行一些代码?我想删除应用程序退出时的临时数据。我所说的应用程序退出是指应用程序并没有在后台运行,它完全消失了

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

我无法在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;
    }
}
[Service(Process=“com.lobomonitor”)]
[IntentFilter(新字符串[]{“com.androidgui.ProcessMonitorService”}]
公共类ProcessMonitorService:服务
{
公共覆盖StartCommandResult OnStartCommand(意图、StartCommandFlags标志、int-startId)
{
线程进程线程=新线程(()=>
{
ActivityManager actManager=(ActivityManager)this.GetSystemService(ActivityService);
while(true)
{
睡眠(1000);
IList procList=actManager.runningAppProcess;
procList.Any(i=>i.ProcessName.Equals(“com.androidgui”);
如果(!procList.Any(i=>i.ProcessName.Equals(“com.androidgui”))
{
FolderManager.Singleton.DeleteTempFolder();
打破
}
}
});
processThread.Start();
返回StartCommandResult.RedeliverIntent;
}
公共覆盖iBind OnBind(意图)
{
返回null;
}
}

我不知道这是否有帮助,但若你们关闭了你们的应用程序,那个么后台运行的服务调用方法:

@Override
public void onTaskRemoved(Intent rootIntent){

    super.onTaskRemoved(rootIntent);
}
例如,我有一个运行服务的应用程序。当我杀死应用程序时,这个服务也死了,但我想让它活下去。通过使用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);
}
效果是->我正在杀死我的应用->服务查看任务正在被删除并调用onTaskRemoved->我正在计划在1秒内重新启动服务->服务死亡->一秒后它被唤醒->结果:应用被杀死,我执行了重新启动我的服务的代码,所以它仍然在后台运行(仅在首选项->应用程序作为流程中可见)


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

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

Android方式通常运行良好,属于组件级(活动、服务……) 生命周期管理

一些应用程序允许“退出”功能(通过按钮、菜单等),当激活时 通过用户,允许应用程序关闭所有打开的组件,并基本关闭

但是,如果退出回调确实是您想要的,那么最接近它的可能是 要创建一个专用服务,除了onDestroy()函数之外,没有其他逻辑 并在应用程序启动时激活它,而不关闭它

class ExitListenerService extends Service {
    @Override
    public void onDestroy() {
        super.onDestroy();
        // App exit logic here. Not deterministic!
    }       
}
这样的服务很有可能是应用程序回收的最后一个组件 操作系统。这在大多数情况下都应该有效,对我来说效果很好。但事实并非如此 100%保证

但是,如果你必须有一个防弹的解决方案,我所知道的唯一其他方法就是创建一个对等应用程序,称之为watchdog,它会定期醒来检查天气,而不是你的主应用程序 仍在运行,如果未运行,将激活退出逻辑

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

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

并在运行应用程序上迭代寻找自己的应用程序。

应用程序生命周期由Android操作系统管理,我认为无法检测到它。我无法使用活动生命周期中的任何方法,因为如果我在外部查看器中打开文件并删除活动中的临时文件夹,查看器将显示错误消息,说明文件不存在(即Polaris)谢谢。这是我想要的行为。我刚刚在OnTaskRemoved()中调用了FolderManager.Singleton.DeleteTempFolder();谢谢,我正在搜索类似的内容
  List<RunningAppProcessInfo> runningApps = activityManager.getRunningAppProcesses();