android 获取当前运行的activity(待整理测试····)

来源:互联网 发布:php xss攻击防御 编辑:程序博客网 时间:2024/05/21 06:36

目前做im即时通信聊天,获取到消息需要判定是否是属于当前聊天窗口,以便分别处理,所以查阅了几种方法,几个解决方法:

1-How to get current foreground activity context in android? – Stack Overflow

2-android – How to check if my activity is the current activity running in the screen – Stack Overflow

普遍是采用给每个Activity都添加对应的代码:

 @Override protected void onResume() {     super.onResume();     AppContext.getInstance().setCurrentActivity(this); }  @Override protected void onPause() {     AppContext.getInstance().setCurrentActivity(null);     super.onPause();    } @Override public void onDestroy() {  AppContext.getInstance().setCurrentActivity(null);   super.onDestroy(); }

然后在自己的app中:

此处我的是:

import android.app.Activity;import android.app.Application;public class AppContext extends Application{ private Application parentApp; private Activity curActivity;  public Application getAppContext() {  return parentApp; } private static class LazyHolder {  static AppContext instance = new AppContext(); } public static AppContext getInstance() {  return LazyHolder.instance; } @Override public boolean Start(Map<String, Object> args) {  Object param = args.get(appContext);  if (param instanceof Application) {   parentApp = (Application)param;   return true;  }  return false; } @Override public void Stop(Map<String, Object> args) {  }  public void setCurrentActivity(Activity curActivity){  this.curActivity = curActivity; }  public Activity getCurrentActivity(){  return this.curActivity; }  public boolean isInAdapterActivity(){  boolean isInAdapterActivity = false;  if(null != curActivity){   if(curActivity instanceof AdapterActivity){    isInAdapterActivity = true;   }  }  return isInAdapterActivity; }  public boolean isInScanActivity(){  boolean isInScanActivity = false;  if(null != curActivity){   if(curActivity instanceof ScanActivity){    isInScanActivity = true;   }  }  return isInScanActivity; } public boolean isInMainActivity(){  boolean isInMainActivity = false;  if(null != curActivity){   if(curActivity instanceof MainActivity){    isInMainActivity = true;   }  }  return isInMainActivity; }}

然后在对应各个Activity:

  • AdapterActivity
  • ScanActivity
  • MainActivity

中就可以去调用:

    if(AppContext.getInstance().isInMainActivity()){     //do sth.    }

了。


对应任何的Activity来说,只要处于:

当前运行(Running)

的状态,则都必须经过

onResume

所以,在onResume中,设此时Activity为当前的Activity。

对应的:

当Activity从Running变成别的状态时,也会经过onPause,所以在onPause中去设置当前Activity为null

(切换到别的Activity时,就进入了别的Activity的onResume了,就把别的Activity设置为当前的Activity了)

以及:

当Activity处于onDestory后,也同样设置当前Activity为null)

此时继续之前的循环:

如果进入别的Activity的话,自然会进入onResume,自然会设置别的Activity为当前正在运行的Activity。

---------------------------分割 线----------------------------------

另外找到的两种方法:

第一种:要方便一点(Service中无法使用)

代码如下:

private String getRunningActivityName() {          String contextString = context.toString();          return contextString.substring(contextString.lastIndexOf(".") + 1, contextString.indexOf("@"));  }
第二种:要稍微麻烦一点,需要一个权限(推荐)
代码如下:
<uses-permission android:name="android.permission.GET_TASKS" /> 

private String getRunningActivityName(){                  ActivityManager activityManager=(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);          String runningActivity=activityManager.getRunningTasks(1).get(0).topActivity.getClassName();          return runningActivity;                 }

0 0
原创粉丝点击