精华内容
下载资源
问答
  • 主要介绍了Android中通过view方式获取当前Activity的屏幕截图实现方法,本文方法相对简单,容易理解,需要的朋友可以参考下
  • 获取当前Activity及Fragment名字

    千次阅读 2017-10-12 11:23:54
    在我们接手一个新项目,或者是拿到一份android程序源码的时候,要快速找到需要的代码,该从何下手呢?...这就是今天要介绍的获取当前Activity及Fragment名字的技巧。由于Activity和Fragment的情况十分

    在我们接手一个新项目,或者是拿到一份android程序源码的时候,要快速找到需要的代码,该从何下手呢?当然是从看得见的部分——Activity和Fragment下手。如果app的每个功能页面,你都能知道是在哪个Activity或者Fragment中,那就能快速的找到相关的代码了。这就是今天要介绍的获取当前Activity及Fragment名字的技巧。由于Activity和Fragment的情况十分相似,下面主要以Activity为例。


    一、项目已有BaseActivity

    什么是BaseActivity呢?从它的名字(当然了,名字不是固定的)可以看出,它就是一个基本的Activity,作为其他Activity的父类,用于定义一些基本变量及实现一些基础的功能。所以只要在该BaseActivity的onResume方法加入Log或者Toast表明当前Activity即可:
    [java]   view plain  copy
    1. @Override  
    2. protected void onResume() {  
    3.     super.onResume();  
    4.     Log.e(TAG, "This is " + getClass().getSimpleName());  
    5.     Toast.makeText(this"This is " + getClass().getSimpleName(), Toast.LENGTH_SHORT).show();  
    6. }  


    二、项目中没有BaseActivity

    如果项目中原本没有BaseActivity该怎么办呢?没有就自己建一个咯!新建一个BaseActivity如下:
    [java]   view plain  copy
    1. public class BaseActivity extends Activity {  
    2.   
    3.     protected final String TAG = "BaseActivity";  
    4.   
    5.     @Override  
    6.     protected void onResume() {  
    7.         super.onResume();  
    8.         Log.e(TAG, "This is " + getClass().getSimpleName());  
    9.         Toast.makeText(this"This is " + getClass().getSimpleName(), Toast.LENGTH_SHORT).show();  
    10.     }  
    11. }  
    但是光建好了BaseActivity还不行,还要让我们程序里的Activity都继承于它才行,这里我们利用IDE的替换功能来实现。

    1.使用Android Studio

    对着目录结构的java(在src-main下)右键,选择“replace in path”,如下图所示:

    查找“extends Activity”,替换为“extends BaseActivity”,然后确定。这时会弹出对话框,选择Review:

    我们发现,BaseActivity里面的“extends Activity”也被查找到了,这显然不是我们要的,对上图中的BaseActivity右键-Exclude;然后选择Replace All,这样就大功告成了!

    2.使用Eclipse

    好久没用Eclipse了,有空试一下再补上吧。。。

    三、补充

    • getClass().getSimpleName()可以改为getClass().getName(),这样会连Activity的包名一块输出,这在工程里有同名的Activity时比较有用。
    • 也许你会有疑问:如果子类没有调用父类的super.onResume(),是否就不会执行BaseActivity中的函数了?其实不用担心,因为Activity子类的onResume(),必须调用super.onResume(),否则运行时会报错:E/AndroidRuntime:  Caused by: android.util.SuperNotCalledException: Activity {com.lzm.getcurrentactivity/com.lzm.getcurrentactivity.MainActivity} did not call through to super.onResume()。由此我们可以反过来推断出,程序中原本继承于Activity的所有Activity都调用了父类的super.onResume(),所以改为继承于BaseActivity后,自然也会执行其中的函数了。


    四、缺点

    对于不是直接继承于Activity的(如FragmentActivity)的类无效;但自己写的类除外,比如我们的程序里面写了一个DrawerActivity,该Activity继承于BaseActivity;然后我们有个HomeActivity继承于DrawerActivity,那么HomeActivity也是可以正确获取到的,因为它还是间接继承于BaseActivity。

    虽然有这样的缺点,不过一般来说还是够用了,毕竟我们大部分的Activity都是继承于原生的Activity的,所以少数几个无法获取名字也没太大关系了。


    五、拓展

    利用悬浮按钮或者通知栏,直接获取当前的Activity,这个还没试验过,不知是否可行;如果可行的话,就可以克服上面所提到的缺点了。可能用到的方法参考如下博客: 获得当前正在显示的activity的类名
    展开全文
  • 通过ADB命令获取当前activity

    千次阅读 2017-07-12 14:37:32
    自动化测试需要获得当前activity,来判断处于的页面是否正确; hierarchy view经常连不上真机,无法获得activity,所以直接用 adb命令来查看当前运行的 activity就可以; 方法一: 1、cmd命令中输入:adb ...

    自动化测试需要获得当前的activity,来判断处于的页面是否正确;

    hierarchy view经常连不上真机,无法获得activity,所以直接用 adb命令来查看当前运行的 activity就可以;


    方法一:

    1、cmd命令中输入:adb shell 进入shell命令模式

    2、shell中输入:logcat | grep ActivityManager   真机运行应用,可以实时 查看当前正在运行的Activity;

    I/ActivityManager(  511): START u0 {act=Android.intent.action.INSERT dat=content
    ://com.example.notepad.provider.NotePad/notes cmp=com.example.android.notepad/.N
    oteEditor
    } from pid 12896


    cmp=com.example.android.notepad/.NoteEditor 中, 

    com.example.android.notepad 是包名, NoteEditor是当前活动的activity;



    方法二:

    1.cmd命令中输入:adb shell dumpsys activity activities 

    查看
     
     Main stack:
      * TaskRecord{42c4e888 #11 A com.example.android.notepad U 0}
        numActivities=2 rootWasReset=true userId=0
        affinity=com.example.android.notepad
        intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER
    ] flg=0x10200000 cmp=com.example.android.notepad/.NotesList}
        realActivity=com.example.android.notepad/.NotesList
        askedCompatMode=false
        lastThumbnail=android.graphics.Bitmap@42c89cd8 lastDescription=null
        lastActiveTime=8685859 (inactive for 113s)


     cmp=com.example.android.notepad/.NotesList中, 

    com.example.android.notepad 是包名, NotesList是当前活动的activity;

    adb shell dumpsys activity | grep mFocusedActivity

    运行后可以发现我的手机当前运行的activity是:

    mFocusedActivity: ActivityRecord{42ddcd78 u0 com.android.mms/.ui.ConversationList t3}

    ersationList.java界面,也就是短信息列表的界面。


    展开全文
  • 获取当前Activity的几种方式

    万次阅读 2017-12-25 17:53:58
    判断当前Activity是否是某个需要的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;
    }
    展开全文
  • 获取应用当前activity

    千次阅读 2018-01-11 17:35:14
    获取应用当前activity 1、获取权限 2、调用方法 public void getTopActivityName() { String topActivityClassName = null; ActivityManager activityManager = (ActivityManager) ...

    获取应用当前activity

    1、获取权限

    <uses-permission android:name="android.permission.GET_TASKS"/>
    2、调用方法

    public void getTopActivityName() {
            String topActivityClassName = null;
    
            ActivityManager activityManager = (ActivityManager) (getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE));
            List<ActivityManager.RunningTaskInfo> runningTaskInfos = activityManager.getRunningTasks(1);
            if (runningTaskInfos != null) {
                ComponentName f1 = runningTaskInfos.get(0).topActivity;
                topActivityClassName = f1.getClassName();
                Log.v("topActivityClassName" , topActivityClassName);
                Log.v("numActivities" , ""+runningTaskInfos.get(0).numActivities);
            }
        }
    注意:
    Android 5.0在API权限上作了修改

    Android L,Google has disabled getRunningTasks. Now it can only return own apps task and the home launcher.

    也就是说只能获取当前应用的活动类名,当前应用,当前应用。

    展开全文
  • java中的Activity

    万次阅读 2017-09-19 15:35:52
    Activity 首先,Activity是Android系统中的四大组件之一,可以用于显示View。Activity是一个与用记交互的系统模块,几乎所有的Activity都是和用户进行交互的,但是如果这样就能说Activity主要是用来显示View就不太...
  • 很多时候需要得到当前Activity的实例和Activity的名称,下面给出实现下代码。 一、获取Activity的名字 1,首先需要获取权限 2,编写代码 private static String getRunningActivityName(){ ActivityManager ...
  • public static Activity getActivity() { Class activityThreadClass = null; try { activityThreadClass = Class.forName("android.app.ActivityThread"); Object activityThread = activityThreadClass....
  • 在应用开发过程中,我们经常遇到在Module与App的交互,如果在Module里...人员混杂的项目,没有一个BaseActivity,无法获取当前Activity,实现就比较困难,通过网上学习,找到了一种获取Activity对象的实例的方法
  • 当在dos命令窗口输入aapt提示 则在sdkmanager.exe 中安装android sdk——bulid——tools
  • void onActivityCreated(Activity activity, Bundle savedInstanceState); void onActivityStarted(Activity activity); void onActivityResumed(Activity activity); void onActivityPaused(Activity activity)...
  • 主要介绍了Android获得当前正在显示的activity类名的方法,分析了权限的修改与Java代码的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
  • 在程序猿的世界里,大部分都是接手的别人的项目,而对于一些项目文档全面,项目代码规范,在阅读代码的时候相对轻松些,不至于当前是哪个Activity都不知道。But,理想是丰满的,现实是骨感的。规范的一点的,会写个...
  • android 用java反射修改Activity的组件view的布局或者属性
  • Android开发中需要用到当前 activity实例,如何...1.保存当前Activity实例 import android.app.Activity; import java.lang.ref.WeakReference; public class MyActivityManager { private static MyActivityManag...
  • public class MyActivityManager { private static MyActivityManager ... public void setCurrentActivity(Activity activity) { activityWeakReference = new WeakReference<Activity>(activity); } }
  • Java-android activity横竖屏切换

    千次阅读 2013-06-20 18:58:44
    为了避免横竖屏和以为一些异常导致activity的销毁和数据丢失,就重写onSaveInstanceState这个方法,该方法可以保存当前页面因为异常导致的activity销毁时候数据,然后在下载onCreate的时候调用者写数据就可以了,...
  • Android应用内获取当前栈顶的Activity

    千次阅读 2018-06-06 18:42:27
    通过registerActivityLifecycleCallbacks方法监控Activity的生命周期,从而获取最新打开的Activity。 代码如下(kotlin代码): class CommunityApplication : Application() { init { instance = this } ...
  • Android课上学了Activity之间传值的问题,涉及到Intent,Bundle,按钮事件还有Android的一些基础知识,总结一下留以后复习用。 R类: R是Resource的简写,资源的意思,这个类用于管理project中的资源,看了R类的源...
  • 首先在当前activity(例:名为settingActivity)的Java文件中声明变量 private static TextView title; 之后写一个赋值方法 static void setText(TextView view) { title=view; } 之后打开你要获取的xml的...
  • 打印出来的结果就是包路径加类名 ... ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List runningTasks = am.getRunningTasks(1); RunningTaskInf...
  • 关于获取当前Activity的一些思考 FEB 21ST, 2016 在Android开发过程中,我们有时候需要获取当前的Activity实例,比如弹出Dialog操作,必须要用到这个。关于如何实现由很多种思路,这其中有的简单,有的复杂...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 111,177
精华内容 44,470
关键字:

java获取当前activity

java 订阅