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

在实现IM即时通信聊天功能时,需要判断消息是否属于当前聊天窗口。为此,可以通过在每个Activity的onResume()方法中设置当前Activity,并在onPause()和onDestroy()中清除,以跟踪当前运行的Activity。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值