アプリが最初から開始されている (つまり、まだメモリにない) またはバックグラウンドから開始されている (既にアプリを開いてボタンを押した) ことを識別する方法はありますかhome
?
4 に答える
アクティビティではなくアプリケーションを本当に意味する場合は、android.app.Application オブジェクトから派生したクラスを作成し、このクラスをマニフェストで宣言して、オーバーライドされたメソッドを介してそのライフサイクルを監視できるようにする必要があります。このタイプのオブジェクトは、アプリケーションが最初から開始されるたびに 1 つ作成されるため、アプリケーションのライフサイクル全体でデータを保存する必要がある場合は、このオブジェクトまたは任意の種類のシングルトンを使用することをお勧めします。
APP がバックグラウンド状態から戻ったとき (ホームまたは別のアプリに戻って再びアプリに戻ったとき) を知りたい場合は、これが役立つ可能性があります。これが当てはまらないケースを見つけた場合は、お知らせください。
public class FatherClass extends Activity {
private static int activities = 0;
public void onCreate(Bundle savedInstanceState, String clase) {
super.onCreate(savedInstanceState);
}
protected void onRestart(){
super.onRestart();
if(activities == 0){
Log.i("APP","BACK FROM BACKGROUND");
}
}
protected void onStop(){
super.onStop();
activities = activities - 1;
}
protected void onStart(){
super.onStart();
activities = activities + 1;
}
}
すべてのアクティビティは、このアクティビティから拡張する必要があります。
メインアクティビティが onCreate() (私の例では onCreate ではなく、必要なアクティビティのメソッド) を実行し、別のアクティビティ内からそれを呼び出さない場合 (スプラッシュ画面のように考えてください)、あなたはゼロから始めますが、アクティビティが onRestart() を実行し、カウンターの「アクティビティ」の値が 0「ゼロ」の場合、バックグラウンド状態から戻っています。
コード全体をアプリ固有のスーパー アクティビティに記述する必要があります
boolean isForeground = isInForeground(this);
if ((!hasFocus) && (!isForeground)) {
context.isBackground = true;
Log.v("Alalytics", "Background...");
}
else if (context.isBackground) {
context.isBackground = false;
Log.v("Alalytics", "Forground...");
}
次に...アプリがフォアグラウンドかバックグラウンドかを確認するメソッドを作成します
/** * アプリがフォアグラウンドにあるかどうかをチェックします * * @param context コンテキスト * @return true、フォアグラウンドにある場合 ** /
private boolean isInForeground(Context context) {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
if (appProcesses == null) {
return false;
}
final String packageName = context.getPackageName();
for (RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND
&& appProcess.processName.equals(packageName)) {
return true;
}
}
return false;
}
評判が低いためコメントを追加できないため、Reddy Raaz の新しい回答を追加します。この方法では、一部のユーザーがアプリのインストールを思いとどまらせる可能性がある追加の許可が必要です。フレームワークが実際に Application.onCreate メソッドを呼び出すのは、最初から開始したときだけです。このようにして、追加の許可なしに情報を確実に取得できます。