应用程序级别onResume Android

时间:2015-02-24 09:20:33

标签: android android-lifecycle resume

问题

这个想法非常简单。每当用户从最近的用户回到我的应用程序时,我想显示一个提示密码的简单对话框。

我知道如何使用密码提示对话框,但我的问题是如何理解用户已经从最近进入我的应用程序。如果我在每个活动中将提示放在onResume中,那么即使用户没有从“最近”菜单进入,它也会每次都被触发。

我的应用中有很多活动和片段。所以,我希望有一个更通用或应用程序级别的解决方案。

5 个答案:

答案 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) { }

}