如何识别活动是从后台启动的

时间:2013-04-08 09:22:10

标签: android

我面临的问题是找到如何调用用户定义的方法(Else只是记录消息)当应用程序变为活动状态时从后台进入前台,即如果用户按下主页按钮,应用程序在应用程序转到后台时再来到前台我想显示一个警告框。可以告诉我如何执行此检查应用程序是否已到达前台或提供一些链接。我不明白要搜索什么。有些网站推荐我覆盖OnResume()。但是,即使我回到此活动,每次我的活动从一个活动启动到另一个活动时,都会调用此方法。我只需要在用户从后台到前台时调用此方法。

3 个答案:

答案 0 :(得分:2)

这是一个简单的解决方案。

@Override
    protected void onPause() 
    {
        super.onPause();

        PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
        isScreenOn = powerManager.isScreenOn();
        OnPause  = true;

    }

    @Override
    protected void onResume() 
    {
        super.onResume();
         OnResume = true;      
        if (!isScreenOn) 
            {
                // your code;
            }
    }

    @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();

        if(OnPause == true && OnResume == true && !isScreenOn)
        {
            YourActivity.this.finish();
        }
        isScreenOn = false;
        OnPause = false;
        OnResume = false;
    }

这里是ScreenOn,OnPause,OnResume是布尔值。 当您的手机屏幕锁定时,应用程序进入onPause(),检查“isScreenON”,然后进入“onStop()”,其中isScreenOn设置为false。

当您的活动进入前景时,会调用“onResume”。它会检查isScreenON,它的工作非常完美。

答案 1 :(得分:1)

解决方案很简单

考虑onCreate(),onResume,onPause(),onSaveInstanceState(Bundle outState)这四种方法。

您需要为此活动创建一个长的全局变量

现在,如果Bundle savedInstanceState为null,则将当前时间分配给onCreate()中的此变量,否则从savedInstanceState恢复值

在onResume中检查以毫秒System.currentTimeMillis();为单位的当前时间与此全局变量之间的差异,如果它大于1秒(根据您的需要可以更高),则显示一个要求输入密码的警告框

在onPause()中将System.currentTimeMillis();保存到全局变量。

onSaveInstanceState(Bundle outState)中将全局变量的值存储到bundle以在onCreate()中恢复。

示例代码

        import android.os.Bundle;
        import android.widget.Toast;
        import android.app.Activity;


        public class MainActivity extends Activity {

        long timeLastPause=0;

            @Override

            public void onCreate(Bundle savedInstanceState) 
            {
                super.onCreate(savedInstanceState);   
                setContentView(R.layout.activity_main);


                if(savedInstanceState==null)
                {
                    timeLastPause=System.currentTimeMillis();
//Toast.makeText(this, "App created just now", Toast.LENGTH_LONG).show();
                }
                else
                {
                    timeLastPause=  savedInstanceState.getLong("timeLastPause");

                }





            }

            @Override
                protected void onResume() {
                    // TODO Auto-generated method stub
                    super.onResume();
                    if((System.currentTimeMillis()-timeLastPause)>1000)
                    {
                        Toast.makeText(this, "the app becomes active that is comes to foreground from background", Toast.LENGTH_LONG).show();
                    }
                }


            @Override
                protected void onPause() {
                    // TODO Auto-generated method stub
                    super.onPause();
                    timeLastPause=System.currentTimeMillis();

                }


            @Override
            protected void onSaveInstanceState(Bundle outState) {
                // TODO Auto-generated method stub
                super.onSaveInstanceState(outState);
                outState.putLong("timeLastPause", timeLastPause);
            }


            }

[编辑]

现在好了,对于任意数量的活动[:-0这很棘手,希望它会起作用。我在一些项目中实现了这个并且运行良好]

在MANIFEST中

 <application
        android:name=".TrickyApplication"
         ...
          >

现在创建TrickyApplication.java

public class TrickyApplication extends Application {
    public long lastPause;

    @Override
    public void onCreate() {
        super.onCreate();
        lastPause = 0;
    }
}

现在每个活动onResume()

TrickyApplication app = ((TrickyApplication) this.getApplication());

if (System.currentTimeMillis() - app.lastPause > 1000) {
   Toast.makeText(this, "Show Password Dlg Now", Toast.LENGTH_LONG).show();
            }

以及每项活动onPause()

((TrickyApplication) this.getApplication()).lastPause = System
                .currentTimeMillis();

请注意,第一次使用某些共享首选项管理密码对话框时也会显示密码对话框,并且在用户未设置密码之前不要设置密码对话框,然后在显示对话框之前检查Pref

答案 2 :(得分:0)

我建议使用超时密码。因此,当用户使用该应用程序时,密码将保持“正常”x分钟。

想象一下,如果有人在早上启动应用程序,回到homemenu,并在晚上再次启动它仍然希望用户登录?

超时日期可以轻松存储在SharedPreferences中。 (另请不要将密码作为纯文本存储在SharedPreferences中,而是存储它的散列。