我需要知道用户何时杀死我的应用程序(强制停止)。我一直在阅读具有onStop()
和onDestroy()
功能的android生命周期,这些与用户在我的应用程序上结束的每个活动有关,但与用户强行停止或杀死我的应用程序无关。
有什么方法可以知道用户何时终止了该应用程序?
我需要知道用户何时杀死我的应用程序(强制停止)。我一直在阅读具有onStop()
和onDestroy()
功能的android生命周期,这些与用户在我的应用程序上结束的每个活动有关,但与用户强行停止或杀死我的应用程序无关。
有什么方法可以知道用户何时终止了该应用程序?
Answers:
无法确定何时终止进程。从如何检测android应用是否已被强制停止或卸载?
当用户或系统力量停止您的应用程序时,整个过程将被简单地杀死。没有进行任何回调来通知您这已经发生。
当用户卸载应用程序时,首先将终止该过程,然后删除apk文件和数据目录,以及“软件包管理器”中的记录,这些记录告诉其他应用程序您注册了哪个意图过滤器。
我找到了一种方法来做.....
像这样提供一项服务
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();
}
}
像这样在Manifest.xml中注册此服务
<service android:name="com.example.OnClearFromRecentService" android:stopWithTask="false" />
然后在您的启动活动中启动此服务
startService(new Intent(getBaseContext(), OnClearFromRecentService.class));
现在,只要您最近从android清除应用程序,onTaskRemoved()
就会执行此方法 。
注意:在Android O +中,此解决方案仅在应用程序全天候在前台运行时才有效。在后台运行该应用程序超过1分钟后,系统将自动强制杀死OnClearFromRecentService(以及所有其他正在运行的服务),因此将不会执行onTaskRemoved()。
创建一个应用程序类
onCreate()
Called when the application is starting, before any activity, service, or receiver objects (excluding content providers) have been created.
onLowMemory()
This is called when the overall system is running low on memory, and actively running processes should trim their memory usage.
onTerminate()
This method is for use in emulated process environments.
即使您被应用程序杀死或强制停止,Android也会再次启动您的Application类
深入研究此问题后,我找到了可能对您有所帮助的解决方案:
您需要做的就是使用以下代码检查由所有活动扩展的BaseActivity的onDestroy方法,无论堆栈的最后运行活动是否来自您的程序包,请使用以下代码:
ActivityManager activityManager = (ActivityManager) getSystemService( ACTIVITY_SERVICE );
List<ActivityManager.RunningTaskInfo> taskList = activityManager.getRunningTasks( 10 );
if ( !taskList.isEmpty() )
{
ActivityManager.RunningTaskInfo runningTaskInfo = taskList.get( 0 );
if ( runningTaskInfo.topActivity != null &&
!runningTaskInfo.topActivity.getClassName().contains(
"com.my.app.package.name" ) )
{
//You are App is being killed so here you can add some code
}
}
这可能会帮助很多想知道应用程序是否终止的人,最好的方法是将数据保存在一个静态变量中,例如: public static string IsAppAvailable;
静态变量的特殊之处在于,静态变量中的数据会一直保留到应用程序处于前台或后台为止,一旦应用程序被杀死,静态变量中的数据就会被擦除。基本上,重新创建应用程序时会重新初始化静态变量
创建一个静态类文件,例如Const
namespace YourProject
{
public static class Const
{
public static string IsAppAvailable;
}
}
在MainActivity中
protected override void OnResume()
{
if(string.IsNullOrWhiteSpace(Const.IsAppAvailable))
{
//Your app was terminated
}
Const.IsAppAvailable = "Available"
}
希望这对开发人员有所帮助:)
我有另一种想法。我有与您相同的问题。以上方法未解决。我的问题:“我想在用户完全关闭应用程序时清除所有已保存的数据整个应用程序”
因此,我在Application类中添加了clear()和清除保存的数据(来自共享首选项或tinyDB)。