上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【Android】自身のアプリがフォアグラウンドで起動しているかチェック

自身のアプリケーションがフォアグラウンドにいるか、バックグラウンドにいるのか
チェックしたいことがたまにある。

iOSであれば、アプリケーションのステータスがアクティブであるかどうかで
簡単にチェックすることができる。

[[UIApplication sharedApplication] applicationState] == UIApplicationStateActive


でも、Androidではどうすればよいのか??
調べてみた。


最初に試してみたのは、実行中のプロセス一覧を取得して、パッケージ名で自身のアプリを探して、
自身のアプリの importance が IMPORTANCE_FOREGROUND であるか判定する。


ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> processInfoList = am.getRunningAppProcesses();
for( RunningAppProcessInfo info : processInfoList){
if(info.processName.equals(getPackageName())){
if( info.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND){
// ここにフォアグラウンドの場合の処理を実装
}
}
}


簡易的なアプリに組み込んだ際は、特に問題なく動いていたのだが、
実際に実装を入れたいアプリに入れたら、バックグラウンド時もたまにフォアグラウンドと判定されることがあった。
もしかして、アプリのプロセスをKillされにくくしていたから、たまに裏でFOREGROUNDにしているのかな・・・
バックグラウンドで動くServiceにバインドしたりしているとダメなのか??


次に、実行中タスクリストの先頭のパッケージ名と自身のパッケージ名が一致するか比較して、
一致する場合、フォアグラウンド起動と判断する。


ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
if (am.getRunningTasks(1).get(0).topActivity.getPackageName().equals(getApplicationContext().getPackageName())) {
// ここにフォアグラウンドの場合の処理を実装
}


ちなみに、この場合はマニフェストファイルに以下のパーミッションを追加する必要があります。

<uses-permission android:name="android.permission.GET_TASKS" />


こちらは、想定通りの動きをしていて問題なさそうなのでパーミッションが増えるのを
我慢して後者にした。



【2015/05/15 追記】
ActivityManager::getRunningTasks() はAndroid5.0(APIレベル21)から非推奨になっているので注意が必要。
http://developer.android.com/reference/android/app/ActivityManager.html#getRunningTasks(int)

現時点では、フォアグラウンド判定自体は問題なくできているが、今後振る舞いの変更により判定がおかしくなるかもしれない。


【2015/07/05 追記】

以下の記事に代替案を考えてみました。

【Android】自身のアプリがフォアグラウンドで起動しているかチェック②

ただ、代替案の方法はAPIレベル14からだから、Android2.X系をサポートする場合は、getRunningTasksを使う方法と両方実装して、バージョンで分岐させる必要がありそうです。。。。




[Android] DialogFragmentでのAlertDialogのキャンセル

DialogFragmentで以下のようにダイアログを生成している場合、
AlertDialog.Builderに対して、setCancelable(false)をしても、
バックキーによるキャンセルができてしまう。
#バックキー押下時のキャンセルを抑止したい。。。


@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

Dialog dialog = new AlertDialog.Builder(getActivity())
.setTitle("タイトル")
.setMessage("メッセージ")
.setCancelable(false)
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
}
}
)
.create();
return dialog;
}


ちなみに、以下を指定すれば、ダイアログの外をタップした場合の
キャンセルを抑止することができる
dialog.setCanceledOnTouchOutside(false);



実は、DialogFragment を使用した場合、DialogFragment のインスタンスに対して
setCancelable(false)をしてあげないといけない。

SampleDialogFragment dialogFragment = new SampleDialogFragment();
dialogFragment.setCancelable(false);
dialogFragment.show(getActivity().getFragmentManager(), SampleDialogFragment.class.getName());





プロフィール

hiiro

Author:hiiro

最新記事
カテゴリ
月別アーカイブ
最新コメント
最新トラックバック
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
Counter
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。