目前做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;
}