アプリがアクティブになり、バックグラウンドからフォアグラウンドになったときに、ユーザー定義のメソッドを呼び出す方法を見つけるという問題に直面しています(そうでなければ、単にメッセージをログに記録します)。つまり、ユーザーがホームボタンを押した場合、アプリがフォアグラウンドになったときにアプリがバックグラウンドになりますもう一度警告ボックスを表示したいのですが、アプリがフォアグラウンドになったかどうかを確認する方法や、リンクを提供する方法を教えてください。何を検索すればよいかわかりません。一部のサイトでは、オーバーライドするように勧められOnResume()
ました。ただし、このメソッドは、このアクティビティに戻ったとしても、アクティビティがあるアクティビティから別のアクティビティに起動されるたびに呼び出されます。ユーザーがバックグラウンドからフォアグラウンドに移動したときにのみ、このメソッドを呼び出す必要があります。
3 に答える
これが簡単な解決策です。
@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をチェックし、完全に機能します。
解決策は簡単です
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();
パスワードダイアログも初めて表示されることに注意してください。共有設定でこれを管理できます。ユーザーがパスワードを設定しないか、ダイアログを表示する前にその設定を確認するまで設定しないでください。
パスワードにタイムアウトを使用することをお勧めします。ユーザーがアプリを使用しているとき、パスワードはx分間「OK」のままになります。
誰かが朝にアプリを起動し、ホームメニューに戻り、夕方に再び起動した場合でも、ユーザーにログインしてもらいたいと想像してみてください。
タイムアウト日は、SharedPreferences に簡単に保存できます。(また、パスワードをプレーン テキストとして SharedPreferences に保存するのではなく、そのハッシュを保存してください。