android 如何获取手机当前的Activity实例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 如何获取手机当前的Activity实例相关的知识,希望对你有一定的参考价值。

最近在做一个手机截屏的功能,现在只能对当前的程序进行截图,但是需求是要对任意的软件界面进行截图。所以要拿到当前手机运行的Activity的实例。
使用ActivityManager的RunningTaskInfo只能获取到当前运行的Activity的名字,不能获取到Activity实例。也不要说通过反射,反射得到的只是这个Activity的一个新的对象,并不是正在运行的这个Activity的实例。
希望有知道的大牛告知下如何能获取到。

参考技术A 获取activity实例有两种办法:
1、通过context来获取,简单方便:
private String getRunningActivityName()
String contextString = context.toString();
return contextString.substring(contextString.lastIndexOf(".") + 1, contextString.indexOf("@"));

2、通过特定权限获取
<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;
参考技术B Activity是一个用户交互的界面,一般我们很少用new的方式来获取一个activity的实例,因为没有什么意义。而且也改不了别人的代码。如果你有源码可以看下ActivityManagerService.java这个类,用来管理Activity的。希望对你有帮助 参考技术C 没有系统权限是截不了程序之外的界面的。 参考技术D 你是用的应用截图 还是系统的按键

Android 如何获取当前Activity实例对象?

Android 如何获取当前Activity实例对象?

在项目开发中,遇到这么个情景,Activity是第三方部门的jar包,而我们需要当前界面用户输入的值 并且校验,jar包里面 并没有提供支持,然而这个jar包牵扯跨部门众多,更新困难。在短时间内只能靠我们自己 想办法获取当前屏幕的Activity 实例 对象,然后获取的View 遍历 到自己需要的值。

以上都是废话,直接看需求~。

获取当前屏幕Activity实例对象

网上很多说使用获取Task 名称,利用ActivityManager的runingtask 代码如下:
记得在加AndroidManifest.xml中增加权限

<uses-permission android:name="android.permission.GET_TASKS"/>


ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
        List<RunningTaskInfo> forGroundActivity = activityManager.getRunningTasks(1);
        RunningTaskInfo currentActivity;
        currentActivity = forGroundActivity.get(0);
        String activityName = currentActivity.topActivity.getClassName();

可以看到代码,这样并不能获取到Activity 对象。

ActivityLifecycleCallbacks 是什么?

见名知意,Activity生命周期回调,Application通过此接口提供了一套回调方法,用于让开发者对Activity的生命周期事件进行集中处理。
但是这个要求API 14+ (Android 4.0+)以上使用,幸好我们这个最低支持,满足需求。

ActivityLifecycleCallbacks 怎么使用?

重写Application的onCreate()方法,或在Application的无参构造方法内,调用Application.registerActivityLifecycleCallbacks()方法,并实现ActivityLifecycleCallbacks接口

public void onCreate()   
  super.onCreate();  
  this.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks()   

    @Override  
    public void onActivityStopped(Activity activity)   
        Logger.v(activity, "onActivityStopped");  
      

    @Override  
    public void onActivityStarted(Activity activity)   
        Logger.v(activity, "onActivityStarted");  
      

    @Override  
    public void onActivitySaveInstanceState(Activity activity, Bundle outState)   
        Logger.v(activity, "onActivitySaveInstanceState");  
      

    @Override  
    public void onActivityResumed(Activity activity)   
        Logger.v(activity, "onActivityResumed");  
      

    @Override  
    public void onActivityPaused(Activity activity)   
        Logger.v(activity, "onActivityPaused");  
      

    @Override  
    public void onActivityDestroyed(Activity activity)   
        Logger.v(activity, "onActivityDestroyed");  
      

    @Override  
    public void onActivityCreated(Activity activity, Bundle savedInstanceState)   
        Logger.v(activity, "onActivityCreated");  
      
  );  
; 

这样就能获取到activity的对象了。之前知道还有其他方法可以获取对象,没记住现在已经忘记了。如有大神发现,麻烦告诉小弟。~~谢谢

ActivityLifecycleCallbacks 为什么?

我们查看Application的源码,发现原来 ActivityLifecycleCallbacks 就是Application的内部类。

public class Application extends ContextWrapper implements ComponentCallbacks2 
    private ArrayList<ComponentCallbacks> mComponentCallbacks =
            new ArrayList<ComponentCallbacks>();
    private ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks =
            new ArrayList<ActivityLifecycleCallbacks>();
    private ArrayList<OnProvideAssistDataListener> mAssistCallbacks = null;
    /** @hide */
    public LoadedApk mLoadedApk;
    public interface ActivityLifecycleCallbacks 
        void onActivityCreated(Activity activity, Bundle savedInstanceState);
        void onActivityStarted(Activity activity);
        void onActivityResumed(Activity activity);
        void onActivityPaused(Activity activity);
        void onActivityStopped(Activity activity);
        void onActivitySaveInstanceState(Activity activity, Bundle outState);
        void onActivityDestroyed(Activity activity);
    

再来看是怎么回调的,这是内部API

// —————— Internal API ——————

  /**
     * @hide
     */
    /* package */ final void attach(Context context) 
        attachBaseContext(context);
        mLoadedApk = ContextImpl.getImpl(context).mPackageInfo;
    
       //调用onActivityCreated
    /* package */ void dispatchActivityCreated(Activity activity, Bundle savedInstanceState) 
        Object[] callbacks = collectActivityLifecycleCallbacks();
        if (callbacks != null) 
            for (int i=0; i<callbacks.length; i++) 
                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity,
                        savedInstanceState);
            
        
    
    //调用onActivityStarted
    /* package */ void dispatchActivityStarted(Activity activity) 
        Object[] callbacks = collectActivityLifecycleCallbacks();
        if (callbacks != null) 
            for (int i=0; i<callbacks.length; i++) 
                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityStarted(activity);
            
        
    

其他应用

我们还可以利用ActivityLifecycleCallbacks 做一些数据埋点,统计之类的应用,对其统一做处理。这样对减少Activity的代码入侵。尽量简化和模块化的注入生命周期方法。

水平有限,若有错漏,欢迎指正,批评,如需转载,请注明出处–http://blog.csdn.net/vfush,谢谢!

以上是关于android 如何获取手机当前的Activity实例的主要内容,如果未能解决你的问题,请参考以下文章

Android 如何获取当前Activity实例对象?

Android 如何获取当前Activity实例对象?

Android 如何获取当前Activity实例对象?

Android 如何获取当前Activity实例对象?

如何获取android app的Activity

android开发问题:如何在当前Acitivity中用代码获取上一个Activity名称?