1

当应用程序从后台进入前台时,即如果用户按下主页按钮,当应用程序进入前台时,应用程序将进入后台再次我想显示一个警告框。请有人告诉我如何执行此检查应用程序是否已进入前台或提供一些链接。我不明白要搜索什么。一些网站提到我要覆盖OnResume()。但是,每次我的活动从一个活动启动到另一个活动时都会调用此方法,即使我回到此活动也是如此。只有当用户从后台转到前台时,我才需要调用此方法。

4

3 回答 3

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;
    }

Here isScreenOn, OnPause, OnResume are boolean values. When your mobiles screen gets lock, then the application goes in onPause() where it check for "isScreenON" and then goes in "onStop()" where isScreenOn is set to false.

When your activity comes in foreground "onResume" is called. It checks for the isScreenON and it works absolutely perfect.

于 2013-04-08T11:00:37.903 回答
1

解决方案很简单

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

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

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

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

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

onSaveInstanceState(Bundle outState)存储全局变量的值以在 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 这很棘手,希望它会起作用。我在一些项目中实现了这一点并且工作正常]

在清单中

 <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();

请注意,密码对话框也将首次显示,您可以使用一些共享首选项进行管理,并且在您的用户未设置密码之前不要设置它,然后在显示对话框之前检查该首选项

于 2013-04-08T09:38:02.347 回答
0

我建议对密码使用超时。这样当用户使用该应用程序时,密码将在 x 分钟内保持“正常”。

想象一下,如果有人在早上启动应用程序,然后返回主菜单,然后在晚上再次启动它,您仍然希望用户登录吗?

超时日期可以很容易地存储在 SharedPreferences 中。(另外请不要将密码作为纯文本存储在 SharedPreferences 中,而是存储它的哈希值。

于 2013-04-08T09:29:02.280 回答