获取当前Activity的几种方式

1. 通过RunningTaskInfo的topActivity获取当前Activity实例。通过该种方式获取的Activity,只能保证其已经执行了Activity.onCreate方法,不能保证是否执行了Activity.onResume方法。该方法在api 21以后已经被禁,使用需谨慎。


    public static String getCurrentActivityName(Context context) {
        ActivityManager am = (ActivityManager) context
                .getSystemService(Activity.ACTIVITY_SERVICE);

        List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);

        ComponentName componentInfo = taskInfo.get(0).topActivity;
        return componentInfo.getClassName();
    }

2. 通过Android 4.0之后提供的ActivityLifecycleCallbacks接口监听当前的Activity实例,可以在onActivityCreated或者onActivityResumed当中获取到。建议在onActivityResumed当中去获取,同时最好以软引用或者弱引用的方式持有,防止OOM。(其中XxxApplication是你的工程Application)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            registerActivityLifecycleCallbacks(new ActivityLifeCycleCallbackAdapter() {
                @Override
                public void onActivityResumed(Activity activity) {
                    super.onActivityResumed(activity);
                    activityRef = new SoftReference<Activity>(activity);
                }
            });
        }
public static boolean isActivityResumed(Class<?> clazz) {
        if (clazz == null) {
            throw new NullPointerException("activity class can not be null");
        }

        SoftReference<Activity> currentActivityRef = XxxApplication
                .getCurrentActivityRef();

        if (currentActivityRef == null) {
            return false;
        }

        Activity currentActivity = currentActivityRef.get();
        if (currentActivity == null || !clazz.isInstance(currentActivity)) {
            return false;
        }

        return true;
    }

3. 手写Activity管理栈,可以使用Stack或者List等存储已经执行了Activity.onCreate或者Activity.onResume方法的Activity,并相应在Activity.onPause或者Activity.onDestroy中移除。

4. 反射方式

public static Activity getCurrentActivity () {
    try {
        Class activityThreadClass = Class.forName("android.app.ActivityThread");
        Object activityThread = activityThreadClass.getMethod("currentActivityThread").invoke(
                null);
        Field activitiesField = activityThreadClass.getDeclaredField("mActivities");
        activitiesField.setAccessible(true);
        Map activities = (Map) activitiesField.get(activityThread);
        for (Object activityRecord : activities.values()) {
            Class activityRecordClass = activityRecord.getClass();
            Field pausedField = activityRecordClass.getDeclaredField("paused");
            pausedField.setAccessible(true);
            if (!pausedField.getBoolean(activityRecord)) {
                Field activityField = activityRecordClass.getDeclaredField("activity");
                activityField.setAccessible(true);
                Activity activity = (Activity) activityField.get(activityRecord);
                return activity;
            }
        }
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
    return null;
}
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Android Intent是一种用于在应用程序之间传递消息的机制。它允许您启动新的Activity、Service或BroadcastReceiver等组件,或者在当前Activity中启动其他应用程序组件。Intent可以携带数据,并且可以在不同的应用程序之间共享。 在Android中,常见的Intent用法包括: 1.启动Activity Intent可以用来启动另一个Activity。例如,您可以使用以下代码启动一个名为"SecondActivity"的Activity: ``` Intent intent = new Intent(this, SecondActivity.class); startActivity(intent); ``` 这将在当前Activity中启动一个新的Activity。 2.传递数据 Intent还可以用来在不同的Activity之间传递数据。例如,您可以使用以下代码将一个字符串数据传递到另一个Activity: ``` Intent intent = new Intent(this, SecondActivity.class); intent.putExtra("message", "Hello from MainActivity"); startActivity(intent); ``` 在接收Activity中,可以使用以下代码获取传递的数据: ``` String message = getIntent().getStringExtra("message"); ``` 3.启动Service Intent可以用来启动另一个Service。例如,您可以使用以下代码启动一个名为"MyService"的Service: ``` Intent intent = new Intent(this, MyService.class); startService(intent); ``` 4.发送Broadcast Intent还可以用来发送Broadcast。例如,您可以使用以下代码发送一个名为"com.example.MY_BROADCAST"的Broadcast: ``` Intent intent = new Intent("com.example.MY_BROADCAST"); sendBroadcast(intent); ``` 这将发送一个Broadcast给所有注册了该Broadcast的应用程序。 5.指定Action Intent可以指定一个Action,以便接收方可以识别它并执行相应的操作。例如,以下代码指定了一个名为"com.example.ACTION_DO_SOMETHING"的Action: ``` Intent intent = new Intent(); intent.setAction("com.example.ACTION_DO_SOMETHING"); startActivity(intent); ``` 在接收方中,可以使用以下代码获取Action: ``` String action = getIntent().getAction(); ``` 6.设置类型 Intent可以设置一个数据类型,以便接收方可以根据该类型来处理数据。例如,以下代码指定了一个MIME类型为"image/jpeg"的数据类型: ``` Intent intent = new Intent(); intent.setType("image/jpeg"); startActivity(intent); ``` 在接收方中,可以使用以下代码获取数据类型: ``` String type = getIntent().getType(); ``` 以上是Android Intent的几种常见用法。使用Intent可以方便地在不同的组件之间传递数据和消息,并且可以执行各种操作。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值