Android联机或者模拟器单独测试Activity的辅助Activity示例开发

简介:

   想起写个单独测试Activity的辅助Activity的原因是在联机测试的时候IDEA或者Android Studio中的指定运行Activity功能没法使用了。

 

   下面付IDE中指定运行Activity的界面截图:

    wKiom1ZId3ezyUiNAAEPbwkDMQM234.png



    辅助Activity要做的事情是将辅助Activity作为启动的默认Activity,其主界面中以ListView的形式展示所有Activity,通过单击ListView的Item项来启动要测试的Activity。


   1. 辅助Activity代码示例:

    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package  secondriver.app;
 
import  android.app.Activity;
import  android.content.Context;
import  android.content.Intent;
import  android.content.pm.ActivityInfo;
import  android.content.pm.PackageInfo;
import  android.content.pm.PackageManager;
import  android.os.Bundle;
import  android.util.Log;
import  android.view.View;
import  android.view.ViewGroup;
import  android.widget.AdapterView;
import  android.widget.ArrayAdapter;
import  android.widget.LinearLayout;
import  android.widget.ListView;
 
import  java.util.ArrayList;
import  java.util.Arrays;
import  java.util.List;
 
/**
  * Created by Broncho on 2015/11/15.
  */
public  class  TestActivitiesActivity  extends  Activity  implements  AdapterView.OnItemClickListener {
 
     private  LinearLayout mRootView;
     private  ListView mListView;
     private  ArrayAdapter mAdapter;
     private  List<Class> mAllActivities;
 
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         initView();
         mAllActivities = getActivities( this this .getPackageName(), Arrays.<Class>asList( this .getClass()));
         mAdapter =  new  ArrayAdapter( this , android.R.layout.simple_list_item_1, android.R.id.text1, mAllActivities);
         mListView.setAdapter(mAdapter);
         mListView.setOnItemClickListener( this );
     }
 
     private  void  initView() {
         mRootView =  new  LinearLayout( this );
         mListView =  new  ListView( this );
         mListView.setId(android.R.id.list);
         mRootView.addView(mListView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
         setContentView(mRootView);
     }
 
     @Override
     public  void  onItemClick(AdapterView<?> parent, View view,  int  position,  long  id) {
         Class activity = mAllActivities.get(position);
         //启动指定的Activity
         startActivity( new  Intent( this , activity));
     }
 
     /**
      * 获取所有要测试的Activity Class
      *
      * @param context
      * @param packageName
      * @param excludeActivities
      * @return
      */
     public  static  List<Class> getActivities(Context context, String packageName, List<Class> excludeActivities) {
         final  String TAG =  "GET_ACTIVITY" ;
         List<Class> includeActivities =  new  ArrayList<>();
         try  {
             PackageInfo packageInfo = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
             if  (packageInfo.activities !=  null ) {
                 ActivityInfo[] activityInfos = packageInfo.activities;
                 Log.d(TAG,  "Find "  + activityInfos.length +  " activity in AndroidManifest.xml." );
                 for  (ActivityInfo activityInfo : activityInfos) {
                     Class activityClass;
                     String activityName = activityInfo.name;
                     try  {
                         activityClass = Class.forName(activityName);
                         if  (Activity. class .isAssignableFrom(activityClass)) {
                             includeActivities.add(activityClass);
                         }
                     catch  (ClassNotFoundException e) {
                         Log.d(TAG,  "Class not found activity "  + activityName +  " in package "  + packageName);
                     }
                 }
             }
             Log.d(TAG,  "Found  "  + includeActivities.size() +  " activity list is :"  + Arrays.toString(includeActivities.toArray()));
             if  ( null  != excludeActivities) {
                 includeActivities.removeAll(excludeActivities);
             }
             Log.d(TAG,  "Last  "  + includeActivities.size() +  " activity  list is :"  + Arrays.toString(includeActivities.toArray()));
         catch  (PackageManager.NameNotFoundException e) {
             Log.d(TAG,  "Android system not found package "  + packageName);
         }
         return  includeActivities;
     }
}


   在AndroidManifest.xml中讲辅助Activity设置为默认启动的Activity,之后就可以通过选择点击要启动的Activity来进行测试。该示例还可以通过添加一些代码来增强,比如启动Activity的时候可以通过输入对话框的方式携带数据至启动的Activity。测试完成后删除或者充足默认启动的Activity即可。


  2.  配置AndroidManifest.xml :

  

1
2
3
4
5
6
7
8
< activity  android:name = ".TestActivitiesActivity" >
     < intent-filter >
         < action  android:name = "android.intent.action.MAIN" />
         < category  android:name = "android.intent.category.LAUNCHER" />
     </ intent-filter >
</ activity >
< activity  android:name = ".OneActivity" />
< activity  android:name = ".TwoActivity" />


    3. 调试日志:

    

1
2
3
11 - 15  20 : 07 : 31.899  10665 - 10665 /secondriver.app D/GET_ACTIVITY: Find  3  activity in AndroidManifest.xml.
11 - 15  20 : 07 : 31.899  10665 - 10665 /secondriver.app D/GET_ACTIVITY: Found activity have  3  list is :[ class  secondriver.app.TestActivitiesActivity,  class  secondriver.app.OneActivity,  class  secondriver.app.TwoActivity]
11 - 15  20 : 07 : 31.899  10665 - 10665 /secondriver.app D/GET_ACTIVITY: Last activity have  2  list is :[ class  secondriver.app.OneActivity,  class  secondriver.app.TwoActivity]


   从日志中可以看到一共发现了3个Activity类,去除辅助的Activity,在ListView中讲显示2个Item项。

   

   


        后期追加内容:

    4. 结果效果图

      

      wKiom1Z9CICQdz3EAADuSj8GZYI065.png


    新源码参见附件:TestActivitiesActivity.java.txt

       Item状态变化Drawable文件内容如下:

    wKioL1Z9ClrwclwZAABCZpQXEH0764.png



本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1712943,如需转载请自行联系原作者

相关文章
|
6天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
24 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
28天前
|
Java Android开发
Android 开发获取通知栏权限时会出现两个应用图标
Android 开发获取通知栏权限时会出现两个应用图标
14 0
|
1月前
|
XML 缓存 Android开发
Android开发,使用kotlin学习多媒体功能(详细)
Android开发,使用kotlin学习多媒体功能(详细)
103 0
|
1月前
|
传感器 算法 计算机视觉
基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容是关于一个基于肤色模型和中值滤波的手部检测算法的描述,包括算法的运行效果图和所使用的软件版本(matlab2022a, vivado2019.2)。算法分为肤色分割和中值滤波两步,其中肤色模型在YCbCr色彩空间定义,中值滤波用于去除噪声。提供了一段核心程序代码,用于处理图像数据并在FPGA上实现。最终,检测结果输出到&quot;hand.txt&quot;文件。
|
1月前
|
设计模式 人工智能 开发工具
安卓应用开发:构建未来移动体验
【2月更文挑战第17天】 随着智能手机的普及和移动互联网技术的不断进步,安卓应用开发已成为一个热门领域。本文将深入探讨安卓平台的应用开发流程、关键技术以及未来发展趋势。通过分析安卓系统的架构、开发工具和框架,本文旨在为开发者提供全面的技术指导,帮助他们构建高效、创新的移动应用,以满足不断变化的市场需求。
18 1
|
2天前
|
算法 计算机视觉 异构计算
基于FPGA的图像累积直方图verilog实现,包含tb测试文件和MATLAB辅助验证
该内容展示了FPGA实现图像累积直方图的算法。使用Vivado2019.2和matlab2022a,通过FPGA的并行处理能力优化图像处理。算法基于像素值累加分布,计算图像中像素值小于等于特定值的像素个数。核心代码为`test_image`模块,读取二进制图像文件并传递给`im_hist`单元,生成直方图和累积直方图。
|
2天前
|
数据库 Android开发 开发者
安卓应用开发:构建高效用户界面的策略
【4月更文挑战第24天】 在竞争激烈的移动应用市场中,一个流畅且响应迅速的用户界面(UI)是吸引和保留用户的关键。针对安卓平台,开发者面临着多样化的设备和系统版本,这增加了构建高效UI的复杂性。本文将深入分析安卓平台上构建高效用户界面的最佳实践,包括布局优化、资源管理和绘制性能的考量,旨在为开发者提供实用的技术指南,帮助他们创建更流畅的用户体验。
|
5天前
|
Java API Android开发
Android 11 修改libcore Cipher AS测试
Android 11 修改libcore Cipher AS测试
13 1
|
19天前
|
XML 开发工具 Android开发
构建高效的安卓应用:使用Jetpack Compose优化UI开发
【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。
|
22天前
|
监控 算法 Android开发
安卓应用开发:打造高效启动流程
【4月更文挑战第5天】 在移动应用的世界中,用户的第一印象至关重要。特别是对于安卓应用而言,启动时间是用户体验的关键指标之一。本文将深入探讨如何优化安卓应用的启动流程,从而减少启动时间,提升用户满意度。我们将从分析应用启动流程的各个阶段入手,提出一系列实用的技术策略,包括代码层面的优化、资源加载的管理以及异步初始化等,帮助开发者构建快速响应的安卓应用。