有時候,需要獲取當前位于棧頂的activity的實例。這里介紹2種方法,以及各自適用的場景。最后有demo測試數據以供參考
第一種方法:獲取棧頂activity的實例 應用場景:項目中,activity都繼承于一個BaseActivity,在這個base中,有個廣播接收器,收到廣播,就彈出一個dialog?,F打開多個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@eff3d7802-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@eff3d7802-24 10:56:13.032 13043-13043/com.chen.demo E/onActivityResumed===: com.chen.demo.MainActivity_1@eff3d78點擊MainActivity_1中按鈕去往MainActivity_202-24 10:56:47.692 13043-13043/com.chen.demo E/onActivityPaused===: com.chen.demo.MainActivity_1@eff3d7802-24 10:56:47.718 13043-13043/com.chen.demo E/onActivityCreated===: com.chen.demo.MainActivity_2@53c82a702-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@53c82a702-24 10:56:47.724 13043-13043/com.chen.demo E/onActivityResumed===: com.chen.demo.MainActivity_2@53c82a702-24 10:56:48.099 13043-13043/com.chen.demo E/onActivityStopped===: com.chen.demo.MainActivity_1@eff3d78點擊MainActivity_2中按鈕去往MainActivity_302-24 10:57:21.984 13043-13043/com.chen.demo E/onActivityPaused===: com.chen.demo.MainActivity_2@53c82a702-24 10:57:21.999 13043-13043/com.chen.demo E/onActivityCreated===: com.chen.demo.MainActivity_3@f2b18ec02-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@f2b18ec02-24 10:57:22.003 13043-13043/com.chen.demo E/onActivityResumed===: com.chen.demo.MainActivity_3@f2b18ec02-24 10:57:22.382 13043-13043/com.chen.demo E/onActivityStopped===: com.chen.demo.MainActivity_2@53c82a7新聞熱點
疑難解答