Android:IOS的等价物#39; " applicationDidEnterBackground()"

时间:2015-12-07 11:29:33

标签: android android-lifecycle onpause

我正在处理应用程序和IOS版本,每当外部事件发生时,例如主页按钮或应用程序中出现的呼叫显示其密码输入屏幕,因为它显示敏感数据。

我试图在android中复制这个,我遇到了麻烦,因为可以调用生命周期方法,这并不一定意味着它是一个外部事件,就像另一个应用程序关注的那样。

是否有一种标准方法可以检测onPause()是否被调用,因为外部事件触发了它?

编辑:我有一个部分有效的解决方案:

@Override
public void onTrimMemory(int level) {
    super.onTrimMemory(level);

    Intent login = new Intent(this, AppEntryPoint.class);
    login.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(login);
}

这个问题是,如果按下主页按钮,则会调用此方法,但是当应用程序失去焦点时,它会被触发的登录意图重新聚焦。

这同样适用于打开的应用程序按钮,按下它我的应用程序进入登录屏幕,这会遮挡页面的视图,但它会立即再次聚焦。

我想要解雇的意图,但不要让应用程序重新聚焦。

2 个答案:

答案 0 :(得分:2)

您可以使用TRIM_MEMORY_UI_HIDDEN回调。

  

onTrimMemory(int)的级别:该进程一直在向用户显示   界面,不再这样做了。使用UI进行大量分配   应该在此时发布,以便更好地管理内存。

示例:

创建一个从Application扩展的类,在Manifest中注册并覆盖它onTrimMemory

清单:

 <application
        android:name=".AppContext" // the declared class name
        android:allowBackup="true"
        android:icon="@mipmap/app_icon"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        tools:replace="icon"
        >

应用程序类:

public class AppContext extends Application{

....

@Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);

        if(level >= TRIM_MEMORY_UI_HIDDEN)
        {
          //do your job here
        }
    }

答案 1 :(得分:1)

我无法分享我的所有代码,但其基本要点是:

设置静态整数以跟踪应用的状态

例如:

private static int resumed = 0;
private static int paused = 0;
private static int started = 0;
private static int stopped = 0;
private static boolean appInBackground = true;

相应地更新这些整数

例如:

@Override
public void on ActivityResumed(Activity activity) {
    ++resumed;
}

@Override
public void onActivityPaused(Activity activity) {
    ++paused;
}

@Override
public void onActivityStopped(Activity activity) {
    ++stopped;
    if(stopped == started) {
        appInBackground = true;
        // other stuff here
    }
}

用户可以通过逻辑确定应用的状态

例如:

public static boolean isApplicationInForeground() {
    return resumed > paused;
}

所有这些都在AppLifecycleHandler文件中。我希望这有帮助,尽管我无法分享我的代码的所有细节!