如何知道我的应用程序何时被杀?

xienkqul  于 2022-09-21  发布在  Android
关注(0)|答案(8)|浏览(219)

我需要知道用户何时终止我的应用程序(强制停止)。我一直在阅读Android生命周期,它有onStop()onDestroy()函数,这些函数与用户在我的应用程序上结束的每一项活动相关,但不涉及用户强制停止或终止我的应用程序。

有没有办法知道用户何时关闭这款应用程序?

lskq00tm

lskq00tm1#

我找到了一种方法来做到这一点……

1.像这样做一次服务

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

1.在Manifest.xml中注册该服务,如下所示

<service android:name="com.example.OnClearFromRecentService" android:stopWithTask="false" />

1.然后在你的Splash活动上启动这项服务

startService(new Intent(getBaseContext(), OnClearFromRecentService.class));

现在,每当你要从Android中清除你的应用程序,那么这个方法onTaskRemoved()就会执行。

注意:在安卓O+中,这个解决方案只在应用程序处于前台全时运行时有效。在应用程序在后台运行超过1分钟后,OnClearFromRecentService(和所有其他正在运行的服务)将自动被系统强制终止,因此onTaskRemove()将不会被执行。

xdnvmnnf

xdnvmnnf2#

无法确定进程何时终止。从How to detect if android app is force stopped or uninstalled?开始
当用户或系统强制停止您的应用程序时,整个进程将被终止。没有回调来通知您发生了这种情况。

当用户卸载应用程序时,首先进程会被终止,然后你的APK文件和数据目录以及包管理器中的记录都会被删除,这些记录会告诉其他应用程序你注册了哪些意图过滤器。

vaj7vani

vaj7vani3#

创建应用程序类

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也会再次启动你的应用程序类

xyhw6mcr

xyhw6mcr4#

在深入研究这个问题后,我找到了一个可能对您有帮助的解决方案:

您只需使用以下代码检查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
         }
    }
qybjjes1

qybjjes15#

在某些情况下,您可以创建闪屏页面,以确定APP之前是否已被系统终止。

它基本上是一个带有意图过滤器主/启动器的屏幕,并将完成,更改为主活动。

因此,每次用户访问SplashScreen,它都会显示该应用程序之前被杀过,你可以做任何你想处理的事情。

示例代码:

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="id.gits.yourpackage">

    <application
        android:name=".App">
        <activity android:name=".SplashActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

SplashActivity:

class SplashActivity : AppCompatActivity() {
    override fun onCreate() {
        super.onCreate()
        doSomethingAfterAppKilled()
    }
}
5cg8jx4n

5cg8jx4n6#

我发现了一些适合我的东西(在小米),你必须创建一个类,比如“MyWatch”,并在你的创建中调用它,如下所示:getLifeccle().addWatch(MyWatch(This))。

class MyObserver(var context: Context) : LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun disconnect() {
        Log.e("APP", "killed")
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun pause(){
        Log.e("APP","Paused") //para pausa
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun resume(){
        Log.e("APP","Resumed") //para retorno de pausa
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun stop(){
        Log.e("APP","Stopped") // para cambio de actividad
    }
}
uqjltbpv

uqjltbpv7#

这可能会帮助许多想知道应用程序是否终止的人,最好的方法是将数据保存在一个静态变量中,例如:public static string IsAppAvailable;

静态变量的特点是静态变量中的数据一直包含到应用程序的前台或后台,一旦应用程序被杀,静态变量中的数据就会被擦除。基本上,静态变量是在新创建应用程序时重新初始化的

创建一个静态类文件,名为常量

namespace YourProject
{
    public static class Const
    {
        public static string IsAppAvailable;
     }
}

在主要活动中

protected override void OnResume()
    {
       if(string.IsNullOrWhiteSpace(Const.IsAppAvailable))
       {
          //Your app was terminated
       }
       Const.IsAppAvailable = "Available" 
    }

希望这对开发人员有帮助:)快乐编码

ars1skjm

ars1skjm8#

我有另一个想法。我和你有同样的问题。上面的方法不能修复。我的问题:当用户完全关闭应用程序时,我想清除整个应用程序中保存的所有数据。

因此,我在应用程序类中添加了Clear()和Clear Saved Data(来自共享首选项或tinyDB)。

相关问题