如何检测应用程序何时进入最小化或退出

时间:2017-03-03 10:13:31

标签: android cycle

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

7 个答案:

答案 0 :(得分:1)

在您的所有活动中:

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

在您的主要活动中:

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

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

答案 1 :(得分: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 :(得分:0)

我使用此方法来检测应用程序是否进入后台或被杀死

第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方法

尝试使用您的代码并告诉我它是否正常工作。 快乐编码:)

答案 3 :(得分:-1)

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

答案 4 :(得分:-1)

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

根据您的需要,您可以添加

到您的Android清单。这将使用名称&#34; YourApplication&#34;

调用这样的类
public class YourApplication extends Application {
  @Override
  public void onCreate() {}
  public public void onTerminate() {
    super.onTerminate();
  }
}

e.g。为&#34; onCreate&#34;或者&#34; onTerminate&#34;整个应用程序(不是每个活动)。 但是java文档说你不应该相信在每个应用程序销毁时调用onTerminate(参见:android.app.Application subclass, onTerminate is not being called)。

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

  • 添加自己的Methode&#34; onPause&#34;和&#34; onResume&#34;到您的应用程序类
  • 在您调用onPause或onResume
  • 时存储到Application类的所有活动中
  • 并且当你们所有的活动都在&#34; onPause&#34;
  • 时,你称之为自己的Application.onPause
  • 当第一个Activity重新进入时,你会调用Application.onResume &#34;的onResume&#34;

答案 5 :(得分:-1)

实施

  

Application.ActivityLifecycleCallbacks

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

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

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

registerActivityLifecycleCallbacks(this);

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

private static boolean 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变量的值执行所需的操作。

答案 6 :(得分:-3)

非常简单。

您可以通过采用如下字符串变量来检查:

 static String active = "false";
 **Thing to do :** 



 if (active.equals("pause")) {
                        //do your pause task
                    }

     @Override
    public void onPause() {
        super.onStart();
        active = "pause";
}


     @Override
    public void onStart() {
        super.onStart();
        active = "start";
}


     @Override
    public void onDestroy() {
        super.onStart();
        active = "destroy";
}

通过检查String变量,您可以实现。