Androidで現在のフォアグラウンドアクティビティコンテキストを取得するにはどうすればよいですか?


171

ブロードキャストが実行されるときはいつでも、フォアグラウンドアクティビティに対するアラートを表示したいと思います。


アクティビティのコンテキストを取得する場所から。これは、アプリのアクティビティまたは他のアプリケーションになります。
AAnkit

これはアプリのアクティビティです。broadcastreceiver onreceive()関数でアラートダイアログのコーディングを行いました。
Deepali 2012

アプリのアクティビティ!これはあなたのアプリですか?そして、なぜこれが欲しいのですか、理由は何ですか、同じことの代替案があるかもしれません
AAnkit

フォアグラウンドアクティビティに関するアラートを表示したい。コンテキストなしでフォアグラウンドアクティビティに対するアラートを表示する他の方法です。
Deepali 2012

1
onreceiveのみで、パラメーターとしてCOntextを取得すると、context.getApplicationContext()と言うことができます
AAnkit

回答:


39

ことを知ってActivityManagerは管理活動を、私たちから情報を得ることができますActivityManager。現在のフォアグラウンド実行アクティビティを取得します

ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
ComponentName cn = am.getRunningTasks(1).get(0).topActivity;

UPDATE 2018/10/03
getRunningTasks()は非推奨です。以下の解決策を参照してください。

このメソッドはAPIレベル21で廃止されました。Build.VERSION_CODES.LOLLIPOP以降、このメソッドはサードパーティのアプリケーションで使用できなくなりました。ドキュメント中心の最近の機能の導入により、呼び出し元に個人情報が漏洩する可能性があります。下位互換性のために、データの小さなサブセットが返されます。少なくとも、呼び出し元のタスク、および場合によっては、機密性が低いことがわかっているhomeなどのその他のタスクです。


16
Martinは、getRunningTasksのSDKヘルプから「注:このメソッドは、タスク管理ユーザーインターフェイスのデバッグと表示のみを目的としています。これは、アプリケーションのコアロジックには使用しないでください」
ruhalde

3
どうやら、これはAndroid 5 / Lollipopで実行中のタスクの限られたサブセットのみをサポートしています。
Sam

7
ActivityManager.getRunningTasks()のドキュメントには、「このメソッドはAPIレベル21で廃止された」と記載されています。
markhep 2016

210

注: API 14で公式APIが追加されました:この回答を参照してくださいhttps://stackoverflow.com/a/29786451/119733

以前の(waqas716)回答は使用しないでください。

アクティビティへの静的参照のため、メモリリークの問題が発生します。詳細については、次のリンクを参照してくださいhttp://android-developers.blogspot.fr/2009/01/avoiding-memory-leaks.html

これを回避するには、アクティビティ参照を管理する必要があります。マニフェストファイルにアプリケーションの名前を追加します。

<application
    android:name=".MyApp"
    ....
 </application>

あなたのアプリケーションクラス:

  public class MyApp extends Application {
        public void onCreate() {
              super.onCreate();
        }

        private Activity mCurrentActivity = null;
        public Activity getCurrentActivity(){
              return mCurrentActivity;
        }
        public void setCurrentActivity(Activity mCurrentActivity){
              this.mCurrentActivity = mCurrentActivity;
        }
  }

新しいアクティビティを作成します。

public class MyBaseActivity extends Activity {
    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);
    }
}

したがって、アクティビティのActivityクラスを拡張する代わりに、MyBaseActivityを拡張するだけです。これで、次のようなアプリケーションまたはアクティビティコンテキストから現在のアクティビティを取得できます。

Activity currentActivity = ((MyApp)context.getApplicationContext()).getCurrentActivity();

9
WeakReferenceを使用して、少ないコードで同じ結果を得ることができます。
ナチョコロマ2013年

5
@Nacho WeakReferencesAndroidで使用することをお勧めすることは決してありません。GCは、あなたが思うよりも速くそれらを収集します。
2013年

4
@MaximKorobovはい、アクティビティを使用して別のアクティビティを起動し、このアクティビティを停止する場合は、onCreate()からfinish()を呼び出すことができます。このシナリオでは、onPause()とonStoo()をスキップします。:の下の注を参照してくださいdeveloper.android.com/training/basics/activity-lifecycle/...
ロドリゴLeitão

2
@rekire @NachoColomaの使用はWeakReferenceキャッシングにはお勧めしません。これはキャッシングではありません。つまり、mCurrentActivity生きているときに参照するだけなのでWeakReferenceActivityが上にある間は収集されません。ただしWeakReference、変数がクリアされていない場合は、再開されていない(生きていない/上にない)アクティビティを参照する可能性があるため、@ NachoColomaの提案は間違っています。
TWiStErRob 2014

14
Android APIレベル14以降ではApplication .ActivityLifecycleCallbacks、を使用できるようになるはずです。これはより中心的であり、すべてのアクティビティに管理コードを追加する必要はありません。developer.android.com/reference/android/app/…
Filou

68

@gezdyの回答の上に展開します。

すべてのアクティビティで、Application手動コーディングで自分自身を「登録」する代わりに、レベル14以降、次のAPIを使用して、手動コーディングを減らして同様の目的を達成できます。

public void registerActivityLifecycleCallbacks (Application.ActivityLifecycleCallbacks callback)

http://developer.android.com/reference/android/app/Application.html#registerActivityLifecycleCallbacks%28android.app.Application.ActivityLifecycleCallbacks%29

ではApplication.ActivityLifecycleCallbacks、これActivityに「アタッチ」または「デタッチ」されているものを取得できますApplication

ただし、この手法はAPIレベル14以降でのみ使用できます。


1
他のすべての答えはどうですか?明らかに、これはこの目的のために設計されたAPIです。
Michael Bushe

2
@MichaelBushe-2012年に他の回答が書かれたとき、APIが最近リリースされたばかり(2011年10月)であることを考えると、APIレベル14に応じて、すべてのデバイスで依存するものではありませんでした。
ToolmakerSteve、2015年

4
このアプローチの使用方法を示す答えが見つかりました:stackoverflow.com/a/11082332/199364 利点は、アクティビティ自体に対して何もする必要がないことです。コードはすべてカスタムコールバッククラスにあります。クラスを作成し、それimplements Application.ActivityLifecycleCallbacksを実装するメソッドを追加するだけです。次に、そのクラスのコンストラクター(またはインスタンスがアクティブ/準備完了になったときに実行されるonCreate、init、またはその他のメソッド)にgetApplication().registerActivityLifecycleCallbacks(this);、最後の行として配置します。
ToolmakerSteve

あなたの答えが一番良いと思います
burulangtu

2
素晴らしい答え。唯一の欠点は、現在のアクティビティについてクラスをクエリする必要がある場合でも、アクティビティをどこかに保存する必要があることです。したがって、メモリリークを回避し、参照をnullにする必要があります。
Raphael C

56

アップデート2:これには公式APIが追加されています。代わりにActivityLifecycleCallbacksを使用してください。

更新:

@gezdyが指摘したように、私はそのことに感謝しています。すべてのonResumeを更新するのではなく、現在のアクティビティの参照もnullに設定して、メモリリークの問題を回避するために、すべてのActivityのonDestroyをnullに設定します。

しばらく前に私は同じ機能が必要でしたが、これが私がこれを達成した方法です。すべてのアクティビティで、これらのライフサイクルメソッドをオーバーライドします。

@Override
protected void onResume() {
    super.onResume();
    appConstantsObj.setCurrentActivity(this);

}

@Override
protected void onPause() {
   clearReferences();
   super.onPause();
}

@Override
protected void onDestroy() {        
   clearReferences();
   super.onDestroy();
}

private void clearReferences(){
          Activity currActivity = appConstantsObj.getCurrentActivity();
          if (this.equals(currActivity))
                appConstantsObj.setCurrentActivity(null);
}

これで、ブロードキャストクラスで現在のアクティビティにアクセスして、アラートを表示できます。


3
この回答は、実際にはより多くの賛成票と簡単な解決策を得るはずですが、アクティビティを操作する必要があるが、アクティビティ自体ではないクラスがある場合は強力です。
リビアンスチロン

これは、アクティビティオブジェクトの静的参照に関するものです。どこにでも作成できます:)。それは問題ではありません。
Waqas '24

これは、以前の回答と同等です。Application一度だけ作成され、静的変数のように正確にガベージコレクションされることはありません。
zapl 2013

1
階層的なアクティビティには問題があります。子アクティビティから親アクティビティに戻る場合:(1)は子のonPauseと呼ばれます。(2)親のonResume; (3)子のonDestroy ==>現在のアクティビティはnullになります。メソッドclearReferencesの彼の例の@gezdyのようないくつかのチェックを行う必要があります。
アート

4
@ waqas716条件をに簡略化することをお勧めclearReferences()(this.equals(currActivity))ます。
naXa 14年

51

@lockwobr更新をありがとう

これはAPIバージョン16では100%動作しません。githubでコードを読んだ場合、関数「currentActivityThread」はKitkatで変更されていたため、バージョン19ishと言いたいです。 。

現在にアクセスする Activityは非常に便利です。getActivity不要な質問なしに現在のアクティビティを返す静的メソッドがあればいいのではないでしょうか。

Activityクラスは非常に便利です。アプリケーションのUIスレッド、ビュー、リソースなどへのアクセスを提供します。多くのメソッドにはが必要ですContextが、ポインタを取得するにはどうすればよいですか?ここにいくつかの方法があります:

  • オーバーライドされたライフサイクルメソッドを使用してアプリケーションの状態を追跡する。現在のアクティビティを静的変数に格納する必要があり、すべてのアクティビティのコードにアクセスする必要があります。
  • インストルメンテーションを使用してアプリケーションの状態を追跡する。マニフェストでインストルメンテーションを宣言し、実装し、そのメソッドを使用してアクティビティの変更を追跡します。アクティビティで使用されるメソッドとクラスにアクティビティポインタを渡す。コード注入ライブラリの1つを使用してポインタを注入します。これらのアプローチはすべて、かなり不便です。幸いなことに、現在のアクティビティを取得するはるかに簡単な方法があります。
  • システムは上記の問題なしにすべてのアクティビティにアクセスする必要があるようです。したがって、ほとんどの場合、静的呼び出しのみを使用してアクティビティを取得する方法があります。私はgrepcode.comでAndroidソースを掘り下げるのに長い時間を費やし、探していたものを見つけました。というクラスがありActivityThreadます。このクラスはすべてのアクティビティにアクセスでき、さらに優れているのは、現在のActivityThread。小さな問題が1つだけあります。アクティビティリストにはパッケージへのアクセス権があります。

リフレクションを使用して簡単に解決:

public static Activity getActivity() {
    Class activityThreadClass = Class.forName("android.app.ActivityThread");
    Object activityThread = activityThreadClass.getMethod("currentActivityThread").invoke(null);
    Field activitiesField = activityThreadClass.getDeclaredField("mActivities");
    activitiesField.setAccessible(true);

    Map<Object, Object> activities = (Map<Object, Object>) activitiesField.get(activityThread);
    if (activities == null)
        return null;

    for (Object activityRecord : activities.values()) {
        Class activityRecordClass = activityRecord.getClass();
        Field pausedField = activityRecordClass.getDeclaredField("paused");
        pausedField.setAccessible(true);
        if (!pausedField.getBoolean(activityRecord)) {
            Field activityField = activityRecordClass.getDeclaredField("activity");
            activityField.setAccessible(true);
            Activity activity = (Activity) activityField.get(activityRecord);
            return activity;
        }
    }

    return null;
}

このような方法はアプリのどこでも使用でき、前述のすべてのアプローチよりもはるかに便利です。さらに、見た目ほど危険ではないようです。新しい潜在的なリークやnullポインターは導入されません。

上記のコードスニペットには例外処理がなく、単純に、最初に実行中のアクティビティが探しているものであると想定しています。追加のチェックをいくつか追加したい場合があります。

ブログ投稿


2
Kitkat以上ではmActivitiesはHashMapではなくArrayMapであるため、次の行を変更する必要があります。次のようになります。ArrayMap activities =(ArrayMap)activitiesField.get(activityThread);
Palejandro、2015年

7
支持両方のAPI(18の上下)のレベルのためにそれを使うべき@Palejandro Mapインタフェース代わりにHashMap、またはArrayMap。@AZ_の回答を編集しました。
Yuriy Kolbasinskiy

2
これはAPI バージョン16では100%動作しません。githubでコードを読み取る場合、関数「currentActivityThread」はKitkatで変更されていたため、バージョン19ishと言いたいです。APIバージョンをgithubのリリースに一致させるのは難しいです。
lockwobr

@lockwobrありがとう、あなたがコメントで更新したソリューション:)
AZ_

2
リフレクションを介した内部APIへのアクセスはサポートされておらず、すべてのデバイスまたは将来的には機能しない可能性があります。
ペイ

9

Kotlinで以下を実行しました

  1. アプリケーションクラスの作成
  2. アプリケーションクラスを次のように編集します

    class FTApplication: MultiDexApplication() {
    override fun attachBaseContext(base: Context?) {
        super.attachBaseContext(base)
        MultiDex.install(this)
    }
    
    init {
        instance = this
    }
    
    val mFTActivityLifecycleCallbacks = FTActivityLifecycleCallbacks()
    
    override fun onCreate() {
        super.onCreate()
    
        registerActivityLifecycleCallbacks(mFTActivityLifecycleCallbacks)
    }
    
    companion object {
        private var instance: FTApplication? = null
    
        fun currentActivity(): Activity? {
    
            return instance!!.mFTActivityLifecycleCallbacks.currentActivity
        }
    }
    
     }
  3. ActivityLifecycleCallbacksクラスを作成する

    class FTActivityLifecycleCallbacks: Application.ActivityLifecycleCallbacks {
    
    var currentActivity: Activity? = null
    
    override fun onActivityPaused(activity: Activity?) {
        currentActivity = activity
    }
    
    override fun onActivityResumed(activity: Activity?) {
        currentActivity = activity
    }
    
    override fun onActivityStarted(activity: Activity?) {
        currentActivity = activity
    }
    
    override fun onActivityDestroyed(activity: Activity?) {
    }
    
    override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {
    }
    
    override fun onActivityStopped(activity: Activity?) {
    }
    
    override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
        currentActivity = activity
    }
    
    }
  4. 次のように呼び出すことで、任意のクラスで使用できます。 FTApplication.currentActivity()


5

getCurrentActivity()もReactContextBaseJavaModuleにあります。
(この質問が最初に行われたため、多くのAndroidアプリにもReactNativeコンポーネント(ハイブリッドアプリ)があります。)

ReactNativeのクラスReactContextには、getCurrentActivity()で返されるmCurrentActivityを維持するためのロジック全体が含まれています。

注:getCurrentActivity()がAndroid Applicationクラスに実装されているといいのですが。


場合によっては、ReactContextBaseJavaModuleからのこのコンテキストがnullですが、なぜですか?
Moxor

4

私たちのチームが満足できる解決策を見つけることができなかったので、私たちは自分たちで開発しました。ActivityLifecycleCallbacks現在のアクティビティを追跡し、サービスを通じて公開するために使用します。詳細はこちら:https : //stackoverflow.com/a/38650587/10793


2

後方互換性のために:

ComponentName cn;
ActivityManager am = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
    cn = am.getAppTasks().get(0).getTaskInfo().topActivity;
} else {
    //noinspection deprecation
    cn = am.getRunningTasks(1).get(0).topActivity;
}

4
ComponentNameからアクティビティの現在のインスタンスに移動する方法がない限り、これはIMOの質問に答えません。
nasch

@nasch WeakReferenceは、Applicationクラスからハンドルを保持して取得できComponentNameますActivityが、必要なものが実行中のタスクリストの上にあるかどうかを判断するために必要です。そして、これが質問に完全に答えない場合、受け入れられた答えもそうではありません。
Martin

同意します、受け入れられた回答も質問に完全に回答するわけではありません。
nasch

1
topActivityAndroid Qからのみ利用可能
Eugen Martynov

1

個人的には「Cheok Yan Cheng」が言ったように行いましたが、「リスト」を使用してすべてのアクティビティの「バックスタック」を作成しました。

現在のアクティビティを確認するには、リストの最後のアクティビティクラスを取得する必要があります。

「アプリケーション」を拡張するアプリケーションを作成し、これを実行します。

public class MyApplication extends Application implements Application.ActivityLifecycleCallbacks,
EndSyncReceiver.IEndSyncCallback {

private List<Class> mActivitiesBackStack;
private EndSyncReceiver mReceiver;
    private Merlin mMerlin;
    private boolean isMerlinBound;
    private boolean isReceiverRegistered;

@Override
    public void onCreate() {
        super.onCreate();
        [....]
RealmHelper.initInstance();
        initMyMerlin();
        bindMerlin();
        initEndSyncReceiver();
        mActivitiesBackStack = new ArrayList<>();
    }

/* START Override ActivityLifecycleCallbacks Methods */
    @Override
    public void onActivityCreated(Activity activity, Bundle bundle) {
        mActivitiesBackStack.add(activity.getClass());
    }

    @Override
    public void onActivityStarted(Activity activity) {
        if(!isMerlinBound){
            bindMerlin();
        }
        if(!isReceiverRegistered){
            registerEndSyncReceiver();
        }
    }

    @Override
    public void onActivityResumed(Activity activity) {

    }

    @Override
    public void onActivityPaused(Activity activity) {

    }

    @Override
    public void onActivityStopped(Activity activity) {
        if(!AppUtils.isAppOnForeground(this)){
            if(isMerlinBound) {
                unbindMerlin();
            }
            if(isReceiverRegistered){
                unregisterReceiver(mReceiver);
            }
            if(RealmHelper.getInstance() != null){
                RealmHelper.getInstance().close();
                RealmHelper.getInstance().logRealmInstanceCount("AppInBackground");
                RealmHelper.setMyInstance(null);
            }
        }
    }

    @Override
    public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {

    }

    @Override
    public void onActivityDestroyed(Activity activity) {
        if(mActivitiesBackStack.contains(activity.getClass())){
            mActivitiesBackStack.remove(activity.getClass());
        }
    }
    /* END Override ActivityLifecycleCallbacks Methods */

/* START Override IEndSyncCallback Methods */
    @Override
    public void onEndSync(Intent intent) {
        Constants.SyncType syncType = null;
        if(intent.hasExtra(Constants.INTENT_DATA_SYNC_TYPE)){
            syncType = (Constants.SyncType) intent.getSerializableExtra(Constants.INTENT_DATA_SYNC_TYPE);
        }
        if(syncType != null){
            checkSyncType(syncType);
        }
    }
    /* END IEndSyncCallback Methods */

private void checkSyncType(Constants.SyncType){
    [...]
    if( mActivitiesBackStack.contains(ActivityClass.class) ){
         doOperation()     }
}

}

私の場合、「Application.ActivityLifecycleCallbacks」を使用して次のことを行いました。

  • Merlinインスタンスのバインド/バインド解除(たとえば、モバイルデータを閉じたり開いたりしたときに、アプリが接続を失ったり取得したりしたときにイベントを取得するために使用されます)。「OnConnectivityChanged」インテントアクションが無効にされた後に役立ちます。MERLINの詳細については、MERLIN INFO LINKを参照してください。

  • アプリケーションが閉じられたら、最後のレルムインスタンスを閉じます。他のすべてのアクティビティから拡張され、プライベートRealmHelperインスタンスを持つBaseActivity内でそれを初期化します。REALMの詳細については、REALM情報リンクを参照してください。 たとえば、アプリケーション「onCreate」内でインスタンス化される「RealmHelper」クラス内に静的な「RealmHelper」インスタンスがあります。レルムは「スレッドリンク」されており、レルムインスタンスは別のスレッド内で機能できないため、新しい「RealmHelper」を作成する同期サービスがあります。したがって、Realmのドキュメント「システムリソースリークを回避するには、開いているすべてのRealmインスタンスを閉じる必要があります」に従うために、これを実現するために、「Application.ActivityLifecycleCallbacks」を使用しました。

  • 最後に、アプリケーションの同期が完了したときにトリガーされるレシーバーがあり、同期が終了すると、「IEndSyncCallback」「onEndSync」メソッドが呼び出されます。同期によってデータが更新され、アプリの同期後に他の操作を実行する必要がある場合は、ビューのデータを更新します。

これですべてです。これがお役に立てば幸いです。またね :)


-1

waqas716の答えは良いです。コードとメンテナンスが少ない特定のケースの回避策を作成しました。

フォアグラウンドにあると思われるアクティビティから静的メソッドにビューをフェッチさせることにより、特定の回避策を見つけました。すべてのアクティビティを反復処理して、マーティンの回答から希望するか、アクティビティ名を取得するかを確認できます

ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
ComponentName cn = am.getRunningTasks(1).get(0).topActivity; 

次に、ビューがnullでないかどうかを確認し、getContext()を介してコンテキストを取得します。

View v = SuspectedActivity.get_view();

if(v != null)
{
    // an example for using this context for something not 
    // permissible in global application context. 
    v.getContext().startActivity(new Intent("rubberduck.com.activities.SomeOtherActivity"));
}

ここで同様の問題を探しています。stackoverflow.com/ questions / 22788289 / … 「SuspectedActivity」を取得するにはどうすればよいですか?これはネイティブAPIですか?
ステラ14

2
しかしためのドキュメントからgetRunningTasks"Note: this method is only intended for debugging and presenting task management user interfaces. This should never be used for core logic in an application, ..."developer.android.com/reference/android/app/...
ToolmakerSteve

3
ActivityManager.getRunningTasks()のドキュメントに、「このメソッドはAPIレベル21で廃止されました」と記載されています。
markhep 2016

-2

他の答えは好きではありません。ActivityManagerは、現在のアクティビティを取得するために使用するためのものではありません。スーパークラスとonDestroyに依存するものも壊れやすく、最適なデザインではありません。

正直なところ、私がこれまでに思いついた最高のものは、アクティビティが作成されたときに設定されるアプリケーションの列挙型を維持することです。

別の推奨事項は、可能であれば、複数のアクティビティを使用しないことです。これは、フラグメントを使用するか、私の好みのカスタムビューで行うことができます。


1
列挙型?現在のフォアグラウンドアクティビティのインスタンスを見つけるのにどのように役立ちますか?
ToolmakerSteve、2015年

「スーパークラスとonDestroyに依存しているのも壊れやすい」どのように壊れやすいのでしょうか。
ToolmakerSteve、2015年

-3

かなり単純な解決策は、シングルトンマネージャークラスを作成することです。このクラスには、1つまたは複数のアクティビティへの参照、またはアプリ全体でアクセスしたいその他のものへの参照を格納できます。

UberManager.getInstance().setMainActivity( activity );メインアクティビティのonCreateを呼び出します。

UberManager.getInstance().getMainActivity();アプリ内のどこかを呼び出して取得します。(私は非UIスレッドからToastを使用できるようにするためにこれを使用しています。)

UberManager.getInstance().cleanup();アプリが破棄されるときに必ずへの呼び出しを追加してください。

import android.app.Activity;

public class UberManager
{
    private static UberManager instance = new UberManager();

    private Activity mainActivity = null;

    private UberManager()
    {

    }

    public static UberManager getInstance()
    {
        return instance;
    }

    public void setMainActivity( Activity mainActivity )
    {
        this.mainActivity = mainActivity;
    }

    public Activity getMainActivity()
    {
        return mainActivity;
    }

    public void cleanup()
    {
        mainActivity = null;
    }
}

これは煩わしく、すべてのアクティビティの変更が必要です。AZ_によって答えははるかに良い、それが完全にコードベースでのその他の変更を必要とせずに局在し、スタンドアロンだとしてです。
markhep 2016

-7

私は3年遅れのようですが、誰かが私のようにこれを見つけた場合に備えて、とにかく答えます。

私はこれを単に使用することでこれを解決しました:

    if (getIntent().toString().contains("MainActivity")) {
        // Do stuff if the current activity is MainActivity
    }

「getIntent()。toString()」には、パッケージ名やアクティビティのインテントフィルターなど、他のテキストが多数含まれていることに注意してください。技術的には、アクティビティではなく現在のインテントをチェックしていますが、結果は同じです。たとえば、Log.d( "test"、getIntent()。toString());を使用するだけです。すべてのテキストを表示したい場合。この解決策は少しハックですが、コードははるかにクリーンで、機能は同じです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.