我需要知道用户何时杀死我的应用程序(强制停止)。我一直在阅读android生命周期,它具有onStop()
和onDestroy()
函数,这些函数与用户在我的应用程序上结束的每个活动相关,但不是在用户强制停止或杀死我的应用程序时。
有没有办法知道用户何时杀死该应用?
答案 0 :(得分:111)
我找到了一种方法来做到这一点......
制作一个这样的服务
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()将不会被执行。
答案 1 :(得分:20)
无法确定进程何时被杀死。 来自How to detect if android app is force stopped or uninstalled?
当用户或系统强制停止您的应用程序时,整个 过程简直就是杀了。没有回电通知你 这已经发生了。
当用户卸载应用程序时,首先会终止该进程 您的apk文件和数据目录将与记录一起删除 在程序包管理器中告诉其他应用程序您有哪些意图过滤器 已注册。
答案 2 :(得分:3)
创建一个Application类
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也会启动你的应用程序类
答案 3 :(得分:0)
您始终可以使用此代码:
protected void onCreate(Bundle savedInstanceState) {
//...
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
//inform yourself that the activity unexpectedly stopped
//or
YourActivity.this.finish();
}
});
//...
}
答案 4 :(得分:0)
这可能会帮助很多想知道应用程序是否终止的人
最好的方法是将数据保留在一个静态变量中
例如: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"
}
希望这对开发人员有所帮助:) 编码愉快
答案 5 :(得分:0)
在某些情况下,您可以创建启动画面页面来确定应用程序之前是否已被系统杀死。
它基本上是一个带有意图过滤器主/启动器的屏幕,将完成,和更改为主要活动。
所以,每次用户访问splashScreen时,都会显示该应用之前已经被杀掉,你可以做任何你想做的事情。
答案 6 :(得分:-1)
在深入研究这个问题之后,我找到了一个可以帮到你的解决方案:
您需要做的就是检查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
}
}
答案 7 :(得分:-3)
我有另外的想法。我有像你一样的问题。上面的方法没有修复。我的问题:&#34;我想清除所有保存的数据整个应用程序,当用户完全关闭应用程序&#34;
所以,我添加了clear()&amp;清除Application类中保存的数据(来自共享首选项或tinyDB)。