アプリが画面上で実行されていることを検出する方法はありますか? これは、ユーザーが使用していて、ユーザーに表示されるアプリを意味します。前もって感謝します!
3 に答える
前の回答は優れた汎用ソリューションですが、追加の許可が必要であり、何かが表示されているかどうかを知るという要件を正確に処理できない場合があります。独自のアプリ内からこれを行う場合は、Android が提供するアクティビティ ライフサイクルを使用してアクティビティの可視性を追跡することもできます。
Activity.onPause は、アクティビティがユーザーに表示されなくなるときに発生することに注意してください。(から: http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle )
非表示を検出するために onStop を使用するのは魅力的ですが、これは多くの場合、次のアクティビティが既に表示されている後に起動されます。
逆に、onResume を使用して、アクティビティが表示されていることを追跡できます。
Activity のサブクラス化と android.app.application の実装を介してこれらの動作を使用して、アクティビティが表示されているかどうかを追跡できます。
例えば:
追跡に使用される Application クラス:
public class Application extends android.app.Application {
private static final String TAG = "example";
private Class<? extends BaseActivity> _visibleActivity = null;
public boolean isAnyActivityVisible() {
return (_visibleActivity != null);
}
public synchronized void setVisibleActivity(Class<? extends BaseActivity> activity) {
_visibleActivity = activity;
Log.w(TAG,
String.format("setting visible activity to: %s",
isAnyActivityVisible() ? _visibleActivity.toString() : "none")
);
}
}
これを使用するには、マニフェストの application タグを次のように Application クラスを参照するように調整します。
<application
android:name="com.example.activityvisibletracker.Application" />
...
</application>
すべてのアクティビティが派生する BaseActivity:
public abstract class BaseActivity extends Activity {
@Override
public void onResume(){
super.onResume();
Application app = (com.example.activityvisibletracker.Application) this.getApplication();
app.setVisibleActivity(this.getClass());
}
@Override
public void onPause(){
super.onPause();
Application app = (Application) this.getApplication();
app.setVisibleActivity(null);
}
}
そして最後に、BaseActivity を拡張する Activity の例:
public class MainActivity extends BaseActivity {
// whatever implementation you like
}
何かが表示されているかどうかを知りたいときはいつでも(おそらくアプリのサービスまたはスレッドから)、コンテキストを取得してアプリケーションを取得するだけで、次のように isAnyActivityVisible() を呼び出すことができます。
// cast getApplication() result to your Application type
((com.example.activityvisibletracker.Application)context.getApplicationContext()).isAnyActivityVisible();
ICS でロック画面が呼び出された場合、これは機能しません。アプリがそこに残っていても、ライフサイクル全体を取得できます。