Android检查应用是否已关闭
作者:互联网
我有一个Android应用程序,我需要一个功能或任何广播接收器,可以检查应用程序是否关闭..我不需要在每个活动中调用销毁(应用程序中有大约20个活动)
我试图在Application类中添加此函数
public class ApplicationLifeCycleManager implements ActivityLifecycleCallbacks {
/** Manages the state of opened vs closed activities, should be 0 or 1.
* It will be 2 if this value is checked between activity B onStart() and
* activity A onStop().
* It could be greater if the top activities are not fullscreen or have
* transparent backgrounds.
*/
private static int visibleActivityCount = 0;
/** Manages the state of opened vs closed activities, should be 0 or 1
* because only one can be in foreground at a time. It will be 2 if this
* value is checked between activity B onResume() and activity A onPause().
*/
private static int foregroundActivityCount = 0;
/** Returns true if app has foreground */
public static boolean isAppInForeground(){
return foregroundActivityCount > 0;
}
/** Returns true if any activity of app is visible (or device is sleep when
* an activity was visible) */
public static boolean isAppVisible(){
return visibleActivityCount > 0;
}
public void onActivityCreated(Activity activity, Bundle bundle) {
}
public void onActivityDestroyed(Activity activity) {
Log.wtf("destroyed","app closed!!");
}
public void onActivityResumed(Activity activity) {
foregroundActivityCount ++;
}
public void onActivityPaused(Activity activity) {
foregroundActivityCount --;
}
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
public void onActivityStarted(Activity activity) {
visibleActivityCount ++;
}
public void onActivityStopped(Activity activity) {
visibleActivityCount --;
}
}
我也在Application类中注册了
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(new ApplicationLifeCycleManager());
}
但是当我在activity之间切换时会调用onPaused和onResumed以及onDestroyed函数:因为它检测是否有任何活动被关闭或被破坏甚至恢复
所以任何解决方案来检查应用程序是否在一个功能中关闭?
解决方法:
此答案使用ProcessLifecycleOwner来检测应用程序可见性.
这是Android Architecture Component的一部分.
1.将此lib添加到您的项目中
实现“android.arch.lifecycle:extensions:1.1.1”
2.扩展实现LifecycleObserver的应用程序类
public class AppController extends Application implements LifecycleObserver {
///////////////////////////////////////////////
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onEnterForeground() {
Log.d("AppController", "Foreground");
isAppInBackground(false);
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onEnterBackground() {
Log.d("AppController", "Background");
isAppInBackground(true);
}
///////////////////////////////////////////////
// Adding some callbacks for test and log
public interface ValueChangeListener {
void onChanged(Boolean value);
}
private ValueChangeListener visibilityChangeListener;
public void setOnVisibilityChangeListener(ValueChangeListener listener) {
this.visibilityChangeListener = listener;
}
private void isAppInBackground(Boolean isBackground) {
if (null != visibilityChangeListener) {
visibilityChangeListener.onChanged(isBackground);
}
}
private static AppController mInstance;
public static AppController getInstance() {
return mInstance;
}
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
// addObserver
ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
}
}
并像这样使用它:
AppController.getInstance().setOnVisibilityChangeListener(new ValueChangeListener() {
@Override
public void onChanged(Boolean value) {
Log.d("isAppInBackground", String.valueOf(value));
}
});
不要忘记将应用程序名称添加到清单中
<application
android:name="myPackageName.AppController"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"">
完成.
(Kotlin例子)
https://github.com/jshvarts/AppLifecycleDemo
标签:android,android-activity,android-lifecycle,android-activitymanager 来源: https://codeday.me/bug/20190927/1825040.html