两种获取栈顶Activity的方法

有时候,需要获取当前位于栈顶的activity的实例。这里介绍2种方法,以及各自适用的场景。

第一种方法:获取栈顶activity的实例

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

获取方法:在application中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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方法中

1
2
3
Activity currentActivity = MyApplication.getInstance().getCurrentActivity();

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

第二种方法:获取栈顶activity的完整包名

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

在工具类中创建方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 获得栈中最顶层的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;
}

使用:

1
2
String topActivity_1 = Util.getTopActivity(this);
Log.e("topActivity_1", topActivity_1);
坚持原创技术分享,您的支持将鼓励我继续创作!