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

ここで、isScreenOn、OnPause、OnResume はブール値です。モバイル画面がロックされると、アプリケーションは onPause() に入り、「isScreenON」をチェックしてから、「onStop()」に入り、isScreenOn が false に設定されます。

アクティビティがフォアグラウンドになると、「onResume」が呼び出されます。それはisScreenONをチェックし、完全に機能します。

于 2013-04-08T11:00:37.903 に答える
1

解決策は簡単です

onCreate()、onResume、onPause()、onSaveInstanceState(Bundle outState) の 4 つのメソッドについて考えてみましょう。

このアクティビティの長いグローバル変数を作成する必要があります

あなたが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分間「OK」のままになります。

誰かが朝にアプリを起動し、ホームメニューに戻り、夕方に再び起動した場合でも、ユーザーにログインしてもらいたいと想像してみてください。

タイムアウト日は、SharedPreferences に簡単に保存できます。(また、パスワードをプレーン テキストとして SharedPreferences に保存するのではなく、そのハッシュを保存してください。

于 2013-04-08T09:29:02.280 に答える