Androidで現在のフォアグラウンドアクティビティのコンテキストを取得する方法
この記事では、Androidアプリで現在フォアグラウンドに表示されているアクティビティ(Activity)のコンテキストを取得する方法を解説します。
Serviceやダイアログなど、Activity以外の場所から「今まさに画面に表示されているActivity」を参照したい場面は少なくありません。そんなときに役立つのが、Applicationクラスに現在のアクティビティへの参照を持たせるという定番の手法です。以下、実装手順を順番に見ていきましょう。
ステップ1:新規プロジェクトを作成する
Android Studioを起動し、メニューから「File」→「New Project」を選択して新しいプロジェクトを作成します。必要な項目を入力してプロジェクトの雛形を生成してください。
ステップ2:Applicationクラス「MyApp.java」を作成する
まずは、Applicationクラスを継承した独自クラスを作成し、現在のアクティビティを保持・取得するための仕組みを実装します。
package app.tutorialspoint.com.sample;
import android.app.Activity;
import android.app.Application;
public class MyApp extends Application {
private Activity mCurrentActivity = null;
@Override
public void onCreate() {
super.onCreate();
}
public Activity getCurrentActivity() {
return mCurrentActivity;
}
public void setCurrentActivity(Activity mCurrentActivity) {
this.mCurrentActivity = mCurrentActivity;
}
}
getCurrentActivity()メソッドで現在のアクティビティを取得し、setCurrentActivity()メソッドで参照を差し替えます。Applicationクラスはアプリ全体で唯一のインスタンスであるため、どのコンポーネントからでもアクセスできるのがポイントです。
ステップ3:共通の基底クラス「MyBaseActivity.java」を作成する
次に、アプリ内のすべてのActivityが継承する基底クラスを作成します。ライフサイクルのタイミングで現在のアクティビティを自動的に更新する仕組みを組み込みます。
package app.tutorialspoint.com.sample;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
public class MyBaseActivity extends AppCompatActivity {
protected MyApp mMyApp;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mMyApp = (MyApp) this.getApplicationContext();
}
protected void onResume() {
super.onResume();
mMyApp.setCurrentActivity(this);
}
protected void onPause() {
clearReferences();
super.onPause();
}
protected void onDestroy() {
clearReferences();
super.onDestroy();
}
private void clearReferences() {
Activity currActivity = mMyApp.getCurrentActivity();
if (this.equals(currActivity)) {
mMyApp.setCurrentActivity(null);
}
}
}
onResume()が呼ばれたタイミングで自身を「現在のアクティビティ」として登録し、onPause()やonDestroy()では、自分が登録中のアクティビティだった場合のみ参照をnullにクリアします。これにより、画面が切り替わったりアプリがバックグラウンドに回っても、古い参照が残らなくなります。
ステップ4:「MainActivity.java」から現在のアクティビティを取得する
あとは任意の場所でApplicationContextをMyAppにキャストすれば、現在のアクティビティを簡単に取得できます。
package app.tutorialspoint.com.sample;
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Activity currentActivity = ((MyApp)
getApplicationContext()).getCurrentActivity();
}
}
ステップ5:AndroidManifest.xmlにApplicationクラスを登録する
最後に、作成したMyAppをシステムに認識させるため、マニフェストファイルの<application>タグにandroid:name=".MyApp"を指定します。この記述を忘れるとカスタムApplicationクラスが使用されず、意図した動作にならないので注意してください。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="app.tutorialspoint.com.sample">
<uses-permission android:name="android.permission.CALL_PHONE" />
<application
android:name=".MyApp"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MyBaseActivity" />
</application>
</manifest>
まとめ
Applicationクラスと共通の基底Activityを組み合わせることで、ライフサイクルに沿って現在のフォアグラウンドアクティビティを正確に追跡できます。なお、参照を適切にクリアしないとメモリリークの原因になるため、clearReferences()のような後始末の処理は必ず実装しておきましょう。
-
Androidで現在のスレッドがデーモンかどうかを確認する方法【サンプルコード付き】
はじめに:スレッドとデーモンスレッドとはスレッドとは、軽量なサブプロセスのことであり、UI(ユーザーインターフェース)を妨げることなくバックグラウンド処理を実行する仕組みです。本記事では、Androidアプリにおいて現在のスレッドがデーモンスレッドかどうかを確認する方法を、実際のサンプルコードとともにわかりやすく解説します。なお、デーモンスレッドとは、JVM(Java仮想マシン)の終了を待たずに動作するバックグラウンドスレッドのことです。UIを担当するメインスレッドは、通常デーモンには設定されていません。手順1:新しいプロジェクトを作成するまず、Android Studioで新しいプロジェクト
-
【Android】現在のスレッドIDを取得する方法を解説
本記事では、Androidアプリで現在実行中のスレッドIDを取得する方法を、サンプルコードとともに解説します。スレッドとは?例に入る前に、まず「スレッド」について簡単におさらいしておきましょう。スレッドとは、軽量なサブプロセス(処理の単位)のことであり、UIの動作を妨げることなくバックグラウンドで処理を実行するために使われます。メインスレッドとは別に動作させることで、画面の描画やユーザー操作をブロックせずに、重い処理を並行して行うことが可能になります。このサンプルでは、Thread.currentThread().getId() を呼び出すことで、現在実行中のスレッドIDを取得し、TextVi