2种判断(获取)栈顶activity的方法

本文介绍了两种获取栈顶Activity实例及其完整包名的方法,适用于不同场景。第一种方法适用于需要栈顶Activity上下文的情况,如在BaseActivity中处理广播。第二种方法则用于判断栈顶Activity是否特定,适合于决定是否显示提示等操作。文章提供了详细的实现代码及测试案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时候,需要获取当前位于栈顶的activity的实例。这里介绍2种方法,以及各自适用的场景。最后有demo测试数据以供参考

第一种方法:获取栈顶activity的实例
应用场景:项目中,activity都继承于一个BaseActivity,在这个base中,有个广播接收器,收到广播,就弹出一个dialog。现打开多个activity,这个时候,通过三方推送等方法,发出一个广播,base接收到。因为只需要在栈顶的activity弹出,而不是每个activity都弹出,所以,需要获取栈顶activity的实例(即上下文,传给dialog的构造方法),而不能简单的传个this,否则,会导致每个activity都有dialog弹出。

获取方法:
在application中:

public class MyApplication extends Application {

    private static MyApplication mInstance;
    private Activity app_activity = null;

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
        initGlobeActivity();
    }


    private void initGlobeActivity() {
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                app_activity = activity;
                Log.e("onActivityCreated===", app_activity + "");
            }

            @Override
            public void onActivityDestroyed(Activity activity) {
                app_activity = activity;
                Log.e("onActivityDestroyed===", app_activity + "");
            }

            /** Unused implementation **/
            @Override
            public void onActivityStarted(Activity activity) {
                app_activity = activity;
                Log.e("onActivityStarted===", app_activity + "");
            }

            @Override
            public void onActivityResumed(Activity activity) {
                app_activity = activity;
                Log.e("onActivityResumed===", app_activity + "");
            }

            @Override
            public void onActivityPaused(Activity activity) {
                app_activity = activity;
                Log.e("onActivityPaused===", app_activity + "");
            }

            @Override
            public void onActivityStopped(Activity activity) {
                app_activity = activity;
                Log.e("onActivityStopped===", app_activity + "");
            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
            }
        });
    }

    /**
     * 获取实例
     * @return
     */
    public static MyApplication getInstance() {
        return mInstance;
    }

    /**
     * 公开方法,外部可通过 MyApplication.getInstance().getCurrentActivity() 获取到当前最上层的activity
     */
    public Activity getCurrentActivity() {
        return app_activity;
    }
}

注意:initGlobeActivity()、getInstance()、getCurrentActivity() 这3个方法

使用方法:
在base的展示dialog方法中:

Activity currentActivity = MyApplication.getInstance().getCurrentActivity();

Dialog dialog = new Dialog(currentActivity, R.style.PushDialog);

————————————————————————————————–

第二种方法:获取栈顶activity的完整包名
应用场景:仅仅为了判断当前activity是不是在栈顶,以便决定要不要弹toast等等。
注意:获取到的仅仅是完整包名,判断当前activity在不在栈顶,需要用到String方法中的contains方法等。这个时候需要注意,以免出错。如:栈顶activity名为AB,里面包含A,就认为A是在栈顶,就出错了。最好这个activity的名字很特殊,和其他的没有重合部分

在工具类中创建方法:

/**
     * 获得栈中最顶层的Activity
     *
     * @param context
     * @return
     */
    public static String getTopActivity(Context context) {
        android.app.ActivityManager manager = (android.app.ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> runningTaskInfos = manager.getRunningTasks(1);

        if (runningTaskInfos != null) {
            return (runningTaskInfos.get(0).topActivity).toString();
        } else
            return null;
    }

使用:

String topActivity_1 = Util.getTopActivity(this);
Log.e("topActivity_1", topActivity_1);

测试数据:
现有3个activity:MainActivity_1、MainActivity_2、MainActivity_3
第一个中有按钮,点击跳转到第二个,第二个中有按钮,点击跳转到第三个
代码:

package com.chen.demo;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

/**
 * 基础Activity
 */
public abstract class BaseActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //不显示title
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        initview();
    }

    abstract void initview();

}
package com.chen.demo;

import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

public class MainActivity_1 extends BaseActivity {

    TextView tv;

    @Override
    void initview() {

        setContentView(R.layout.activity_main_1);

        String topActivity_1 = Util.getTopActivity(this);
        Log.e("topActivity_1", topActivity_1);

        tv = (TextView) findViewById(R.id.tv);

        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MainActivity_1.this.startActivity(new Intent(MainActivity_1.this, MainActivity_2.class));
            }
        });

    }

}
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

public class MainActivity_2 extends BaseActivity {

    TextView tv_2;

    @Override
    void initview() {

        setContentView(R.layout.activity_main_2);

        String topActivity_2 = Util.getTopActivity(this);
        Log.e("topActivity_2", topActivity_2);

        tv_2 = (TextView) findViewById(R.id.tv_2);

        tv_2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MainActivity_2.this.startActivity(new Intent(MainActivity_2.this, MainActivity_3.class));
            }
        });

    }

}
package com.chen.demo;

import android.util.Log;

public class MainActivity_3 extends BaseActivity {


    @Override
    void initview() {

        setContentView(R.layout.activity_main_3);

        String topActivity_3 = Util.getTopActivity(this);
        Log.e("topActivity_3", topActivity_3);

    }

}

日志:

程序刚启动

02-24 10:56:12.997 13043-13043/com.chen.demo E/onActivityCreated===: com.chen.demo.MainActivity_1@eff3d78
02-24 10:56:13.030 13043-13043/com.chen.demo E/topActivity_1: ComponentInfo{com.chen.demo/com.chen.demo.MainActivity_1}
02-24 10:56:13.032 13043-13043/com.chen.demo E/onActivityStarted===: com.chen.demo.MainActivity_1@eff3d78
02-24 10:56:13.032 13043-13043/com.chen.demo E/onActivityResumed===: com.chen.demo.MainActivity_1@eff3d78

点击MainActivity_1中按钮去往MainActivity_2

02-24 10:56:47.692 13043-13043/com.chen.demo E/onActivityPaused===: com.chen.demo.MainActivity_1@eff3d78
02-24 10:56:47.718 13043-13043/com.chen.demo E/onActivityCreated===: com.chen.demo.MainActivity_2@53c82a7
02-24 10:56:47.722 13043-13043/com.chen.demo E/topActivity_2: ComponentInfo{com.chen.demo/com.chen.demo.MainActivity_2}
02-24 10:56:47.724 13043-13043/com.chen.demo E/onActivityStarted===: com.chen.demo.MainActivity_2@53c82a7
02-24 10:56:47.724 13043-13043/com.chen.demo E/onActivityResumed===: com.chen.demo.MainActivity_2@53c82a7
02-24 10:56:48.099 13043-13043/com.chen.demo E/onActivityStopped===: com.chen.demo.MainActivity_1@eff3d78

点击MainActivity_2中按钮去往MainActivity_3

02-24 10:57:21.984 13043-13043/com.chen.demo E/onActivityPaused===: com.chen.demo.MainActivity_2@53c82a7
02-24 10:57:21.999 13043-13043/com.chen.demo E/onActivityCreated===: com.chen.demo.MainActivity_3@f2b18ec
02-24 10:57:22.003 13043-13043/com.chen.demo E/topActivity_3: ComponentInfo{com.chen.demo/com.chen.demo.MainActivity_3}
02-24 10:57:22.003 13043-13043/com.chen.demo E/onActivityStarted===: com.chen.demo.MainActivity_3@f2b18ec
02-24 10:57:22.003 13043-13043/com.chen.demo E/onActivityResumed===: com.chen.demo.MainActivity_3@f2b18ec
02-24 10:57:22.382 13043-13043/com.chen.demo E/onActivityStopped===: com.chen.demo.MainActivity_2@53c82a7
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值