我正在处理应用程序和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);
}
这个问题是,如果按下主页按钮,则会调用此方法,但是当应用程序失去焦点时,它会被触发的登录意图重新聚焦。
这同样适用于打开的应用程序按钮,按下它我的应用程序进入登录屏幕,这会遮挡页面的视图,但它会立即再次聚焦。
我想要解雇的意图,但不要让应用程序重新聚焦。
答案 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
文件中。我希望这有帮助,尽管我无法分享我的代码的所有细节!