问题
这个想法非常简单。每当用户从最近的用户回到我的应用程序时,我想显示一个提示密码的简单对话框。
我知道如何使用密码提示对话框,但我的问题是如何理解用户已经从最近进入我的应用程序。如果我在每个活动中将提示放在onResume中,那么即使用户没有从“最近”菜单进入,它也会每次都被触发。
我的应用中有很多活动和片段。所以,我希望有一个更通用或应用程序级别的解决方案。
答案 0 :(得分:10)
实现Application.ActivityLifecycleCallbacks,它将在您的应用程序类中提供所有活动回调。
public class AppController extends Application implements
Application.ActivityLifecycleCallbacks
{
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(this);
}
@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
}
答案 1 :(得分:2)
您可以尝试使用此标记FLAG_ACTIVITY_LAUNCHER_FROM _HISTORY:
if((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY )!=0){
Log.d(TAG, "Called from history");
//clear flag from history
Intent intent = getIntent().setFlags( getIntent().getFlags() & (~ Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY));
setIntent(intent);
}
来源:Android - detecting application launch from home or history
当“A”活动从最近开始时,此标志存在。 如果“A”活动调用“B”活动并且“B”用户按下,则此标志也将出现。 因此,您必须检查标记,当您检测到标记时,您可以通过删除此标记来明确意图,来源:Remove a Paint Flag in Android
答案 2 :(得分:2)
尝试以下示例
/**
* TODO : After update to API level 14 (Android 4.0),
* We should implement Application.ActivityLifecycleCallbacks
*/
public class GlobalApplication extends android.app.Application
{
private boolean inForeground = true;
private int resumed = 0;
private int paused = 0;
public void onActivityResumed( Activity activity )
{
++resumed;
if( !inForeground )
{
// Don't check for foreground or background right away
// finishing an activity and starting a new one will trigger to many
// foreground <---> background switches
//
// In half a second call foregroundOrBackground
}
}
public void onActivityPaused( Activity activity )
{
++paused;
if( inForeground )
{
// Don't check for foreground or background right away
// finishing an activity and starting a new one will trigger to many
// foreground <---> background switches
//
// In half a second call foregroundOrBackground
}
}
public void foregroundOrBackground()
{
if( paused >= resumed && inForeground )
{
inForeground = false;
}
else if( resumed > paused && !inForeground )
{
inForeground = true;
}
}
}
将以下代码放在您的所有活动中。
public class BaseActivity extends android.app.Activity
{
private GlobalApplication globalApplication;
@Override
protected void onCreate()
{
globalApplication = (GlobalApplication) getApplication();
}
@Override
protected void onResume()
{
super.onResume();
globalApplication.onActivityResumed(this);
}
@Override
protected void onPause()
{
super.onPause();
globalApplication.onActivityPaused(this);
}
@Override
public void onDestroy()
{
super.onDestroy();
}
}
答案 3 :(得分:0)
我建议使用 LifecycleObserver 。如果您的Application类实现此接口,则它将一个类标记为LifecycleObserver,它没有任何方法,而是依赖于带有OnLifecycleEvent注释的方法。用法很简单:
public class AndroidApplication extends Application implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onAppStart() {
//enter code here
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onAppStop() {
//enter code here
}
...etc
}
使用Lifecycle.Event,您可以通过Enum访问所有生命周期状态。它是androidx的一部分。
答案 4 :(得分:-1)
尝试一下
import android.app.Activity;
import android.app.Application;
import android.os.Build;
import android.os.Bundle;
public class MyApplication extends Application implements Application.ActivityLifecycleCallbacks {
private Activity mLastActivity;
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(this);
mLastActivity = null;
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) { }
@Override
public void onActivityStarted(Activity activity) { }
@Override public void onActivityResumed(Activity activity) {
if(mLastActivity != null && mLastActivity.equals(activity)) {
// Your function
}
mLastActivity = activity;
}
@Override
public void onActivityPaused(Activity activity) { }
@Override
public void onActivityStopped(Activity activity) { }
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) { }
@Override
public void onActivityDestroyed(Activity activity) { }
}