【问题标题】:Android: equivelent of IOS' "applicationDidEnterBackground()"Android:相当于 IOS 的“applicationDidEnterBackground()”
【发布时间】:2015-12-07 11:29:33
【问题描述】:

我正在开发一个应用程序,并且在 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);
}

这样做的问题是,如果按下主页按钮,则会调用此方法,但当应用失去焦点时,它会通过触发登录 Intent 重新获得焦点。

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

我希望触发意图,但不要让应用重新聚焦。

【问题讨论】:

  • 您必须根据应用程序的逻辑过滤此意图调用。 if(level >= TRIM_MEMORY_UI_HIDDEN) 条件必须以某种方式扩展。
  • 我正在添加额外的条件,我刚刚删除了它们以便于查看问题,问题不在于这种方法。在 startActivity() 调用中,应用程序会在一瞬间失去焦点,但随后立即被拉回前台。我需要阻止这种情况发生,但我不确定如何。
  • 我需要阻止这种情况发生,但我不确定如何 > 也显示应用程序的其他部分

标签: android android-lifecycle onpause


【解决方案1】:

您可以为此使用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
        }
    }

【讨论】:

  • 你实现了这个并且发现它可靠吗?只需阅读您引用的文档,它就会说“例如,当它进入后台并且没有足够的内存来保持尽可能多的后台进程运行时,就会发生这种情况。” “..内存不足..”,如果有足够的内存,这总是可靠的吗?
  • 我已经用这个代码 sn-p 制作了应用程序,它可以正常工作。我的意思是当应用程序的用户界面(例如所有活动)消失时,它总是被调用。
  • 如果有足够的内存,这是否总是可靠的? > 是的
  • 我一直在尝试以您的示例为基础来实现一些适合工作的东西。如果我检测到屏幕隐藏在 onTrimMemory() 中,用户没有输入他们的 pin(遮住屏幕)并且当前登录到应用程序,我可以开始一个新的密码页面意图。问题是,如果按下主页,则意图在此之后触发并使应用程序重新聚焦,这是不理想的。你是怎么解决这个问题的?
  • 它并不完全清楚你想要实现什么。请在您的问题中提供更多详细信息/代码。
【解决方案2】:

我不能分享我所有的代码,但它的基本要点是:

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

例如:

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 文件中。我希望这会有所帮助,尽管我无法分享我的代码的所有细节!

【讨论】:

    猜你喜欢
    • 2015-06-06
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多