【问题标题】:How to detect when the app goes to minimized or exit如何检测应用程序何时最小化或退出
【发布时间】:2017-03-03 10:13:30
【问题描述】:

嘿,我现在有一个应用程序,当 APP 进入 onPause 或 onDestroy 时,我想在其中调用某个函数,因为我想在发生这种情况时调用某个函数。 我试图在一个活动中覆盖 onPause 并在所有项目中扩展该活动,但是在活动之间的每次迁移时都会调用 onPause(这是合乎逻辑的),但这不是我想要的。 我想知道用户何时退出或暂停应用(按下主页按钮) 问候,

【问题讨论】:

  • 你想听onStop()而不是onPause()
  • 定义“用户退出应用程序”.. android中没有这个概念。 编辑:你可以检查isFinishing()里面onPause也许这是你想要的
  • 我的意思是退出应用程序是按下主页按钮(从任何活动),或使用后退按钮退出正常方式。在后退按钮的情况下,我可以很容易地覆盖主活动中的 onstop,但是从任何活动中按下主页呢
  • 按主页按钮更像是 Windows 操作系统中的最小化按钮。它不会退出应用程序
  • Android 中没有“退出应用程序”,但这个问题详细讨论了应用程序的“背景”:stackoverflow.com/questions/4414171/…

标签: android cycle


【解决方案1】:

把这个依赖放到你的 build.gradle 文件中:

dependencies {
implementation "android.arch.lifecycle:extensions:1.1.1"
}

然后在你的 Application 类中,使用这个:

public class MyApplication extends Application implements LifecycleObserver {

@Override
public void onCreate() {
    super.onCreate();
    ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
}

@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
private void onAppBackgrounded() {
    Log.d("MyApp", "App in background");
}

@OnLifecycleEvent(Lifecycle.Event.ON_START)
private void onAppForegrounded() {
    Log.d("MyApp", "App in foreground");
}
}

更新您的 AndroidManifest.xml 文件:

<application
    android:name=".MyApplication"
    ....>
</application>

【讨论】:

  • 需要注意的一点是,如果用户关闭应用太快(比如打开任务切换界面然后不停地向上滑动),该功能不会被触发,因为应用已经被杀死.
【解决方案2】:

在您的所有活动中:

@Override
protected void onUserLeaveHint() {
    super.onUserLeaveHint();
    Log.e("TAG", "Activity Minimized");
}

在你的主要活动中:

@Override
public void onBackPressed() {
    Log.e("TAG", "App Exit");
    super.onBackPressed();
}

注意:无法检测应用何时被系统杀死(例如使用任务管理器退出)

【讨论】:

  • Activity A=> 启动 Activity B ...其中没有一个会被调用 ...但 Activity A 将被“最小化”
  • 是的,我读过......但似乎你不知道活动/应用程序生命周期......应用程序可能在第二个活动中被杀死,然后永远不会调用“应用程序退出”并且应用程序已经死亡...唯一的答案是“android中没有应用退出的概念”
  • @Selvin 我知道,但无法检测到应用程序的系统终止
【解决方案3】:

我使用这种方法来检测应用程序是进入后台还是被杀死

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

} }

第 2 步)在 manifest.xml 中注册此服务

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

第 3 步)然后在您的启动活动中启动此服务

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

所以现在当你的应用被手动杀死时,会调用 onDestroy 方法

在你的代码上试试这个,让我知道它是否有效。 快乐编码:)

【讨论】:

    【解决方案4】:

    如果用户退出应用程序,onDestroy() 回调将被调用,如果用户按下主页按钮,onStop() 回调将被调用。

    【讨论】:

    • 如果我是另外一个活动,除了这两个活动之外
    • 您可以创建一个基础活动,您的所有活动都将从该活动继承,这样您就可以从任何活动中检测回调。
    • 即使所有活动都从 BaseActivity 扩展并带有回调,也没关系。您完成一项活动并开始另一项活动。如何识别应用程序何时退出?
    【解决方案5】:

    所以您想知道整个应用程序何时进入 Bacground,Activity.onPause 中的方法会告诉您单个活动何时进入后台。

    您可以根据需要添加

    到你的 android 清单。这将调用一个名为“YourApplication”的类

    public class YourApplication extends Application {
      @Override
      public void onCreate() {}
      public public void onTerminate() {
        super.onTerminate();
      }
    }
    

    例如整个应用程序的“onCreate”或“onTerminate”(不是每个活动)。 但是 java 文档说你不应该相信在每个应用程序销毁时都会调用 onTerminate(参见:android.app.Application subclass, onTerminate is not being called)。

    我认为最好的方法是,如果你

    • 向您的应用程序类添加自己的方法“onPause”和“onResume”
    • 在调用 onPause 或 onResume 时存储到 Application 类中的所有活动中
    • 当所有活动都处于“onPause”状态时,您称自己为 Application.onPause
    • 当第一个 Activity 重新进入时,您称您为 Application.onResume “onResume”

    【讨论】:

    • onTerminate 从未调用
    • 不如试试我的解决方案的第二部分。
    【解决方案6】:

    实施

    Application.ActivityLifecycleCallbacks

    在您的应用程序类中。它将实现以下 ActivityLifeCycle 方法:

    isActivityVisible()
    onActivityCreated()
    onActivityStarted()
    onActivityResumed()
    onActivityPaused()
    onActivityStopped()
    onActivitySaveInstanceState()
    onActivityDestroyed()
    

    并在应用程序类的 OnCreate() 中注册回调监听器,如:

    registerActivityLifecycleCallbacks(this);
    

    在应用程序类中定义一个全局变量。

    私有静态布尔isActive;

    现在像这样更改活动生命周期的覆盖方法:

     public static boolean isActivityVisible() {
            return isActive;
        }
    
        @Override
        public void onActivityCreated(Activity activity, Bundle bundle) {
    
        }
    
        @Override
        public void onActivityStarted(Activity activity) {
    
        }
    
        @Override
        public void onActivityResumed(Activity activity) {
            isActive = true;
        }
    
        @Override
        public void onActivityPaused(Activity activity) {
            isActive = false;
        }
    
        @Override
        public void onActivityStopped(Activity activity) {
    
        }
    
        @Override
        public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
    
        }
    
        @Override
        public void onActivityDestroyed(Activity activity) {
                isActive = false;
    
        }
    

    您可以对 isActive 变量的值执行所需的操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多