免責事項が表示されるはずです。
プロダクションアプリで以下のコードを使用しています。私はそれをあなたに非常に良いスタートを与える必要がある基本的なサンプルに(アプリケーションの特定の参照とコードを削除)を編集している。
変数mIsAppVisible
変数は、アプリ内の任意の場所(App
クラス)から呼び出すことができ、アプリのフォーカス/視認の必要条件に基づいてコードを実行する必要があるかどうかを確認できます。
あなたは
public class App extends Application {
public static boolean mIsAppVisible = false;
...
}
など、アプリが実際にインタラクティブであるかどうかを確認するためにParentActivity
を拡張し、あなたの活動にmIsAppInBackground
をも確認することができ、「親」の活動のクラスを作成し、すべてのあなたのこと他の活動も拡大する。あなたがあなたの活動の方法を作成することができますあなたの使用のために
public class ParentActivity extends Activity {
public static boolean mIsBackPressed = false;
public static boolean mIsAppInBackground = false;
private static boolean mIsWindowFocused = false;
public boolean mFailed = false;
private boolean mWasScreenOn = true;
@Override
protected void onStart() {
applicationWillEnterForeground();
super.onStart();
}
@Override
protected void onStop() {
super.onStop();
applicationDidEnterBackground();
}
@Override
public void finish() {
super.finish();
// If something calls "finish()" it needs to behave similarly to
// pressing the back button to "close" an activity.
mIsBackPressed = true;
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
mIsWindowFocused = hasFocus;
if (mIsBackPressed && !hasFocus) {
mIsBackPressed = false;
mIsWindowFocused = true;
}
if (!mIsWindowFocused && mFailed)
applicationDidEnterBackground();
if (isScreenOn() && App.mIsAppVisible && hasFocus) {
// App is back in focus. Do something here...
// this can occur when the notification shade is
// pulled down and hidden again, for example.
}
super.onWindowFocusChanged(hasFocus);
}
@Override
public void onResume() {
super.onResume();
if (!mWasScreenOn && mIsWindowFocused)
onWindowFocusChanged(true);
}
@Override
public void onBackPressed() {
// this is for any "sub" activities that you might have
if (!(this instanceof MainActivity))
mIsBackPressed = true;
if (isTaskRoot()) {
// If we are "closing" the app
App.mIsAppVisible = false;
super.onBackPressed();
} else
super.onBackPressed();
}
private void applicationWillEnterForeground() {
if (mIsAppInBackground) {
mIsAppInBackground = false;
App.mIsAppVisible = true;
// App is back in foreground. Do something here...
// this happens when the app was backgrounded and is
// now returning
} else
mFailed = false;
}
private void applicationDidEnterBackground() {
if (!mIsWindowFocused || !isScreenOn()) {
mIsAppInBackground = true;
App.mIsAppVisible = false;
mFailed = false;
// App is not in focus. Do something here...
} else if (!mFailed)
mFailed = true;
}
private boolean isScreenOn() {
boolean screenState = false;
try {
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
screenState = powerManager.isInteractive();
} catch (Exception e) {
Log.e(TAG, "isScreenOn", e);
}
mWasScreenOn = screenState;
return screenState;
}
}
(コードスニペットはMainActivity
を想定)penguinが提案t.cancel();
メソッドを呼び出すためのアニメーションを処理しています。その後、ParentActivity.applicationDidEnterBackground()
メソッドに次のように追加することができます。
if (this instanceof MainActivity) {
((MainActivity) this).cancelTimer();
}
それともParentActivity
クラスにタイマーを追加しinstanceof
チェックや余分な方法を必要としませんでした。あなたのActivity
はBackStack
の最後の要素がある場合は、ホームボタンを押したかのように