启动应用
技术点:1、启动一个应用:激活应用的第一个Activity 2、系统中PackageManager, PackageManager.getPackageInfo()时,不会把整个清单文件给解析,因为消耗资源太高。 默认只解析常用的节点: 也就是manifest和application中的属性值 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.zengfansheng.mobilesafe"
android:versionCode="6"
android:installLocation="preferExternal"
android:versionName="6.0" ><application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.Light.NoTitleBar" >其他的信息,要解析,就要指定flag int flags = PackageManager.GET_ACTIVITIES;
PackageInfo packageInfo = packageManager.getPackageInfo(clickAppInfo.getAppPackageName(), flags); |
核心代码: /**
* 9、启动应用
*/
public void launchApplication() {
PackageManager packageManager = this.getPackageManager();
try {
// 包管理者-懒加载
// 这个flags如果不是获取常见的节点,那么需要指定,否则获取的为null
int flags = PackageManager.GET_ACTIVITIES;
PackageInfo packageInfo = packageManager.getPackageInfo(
clickAppInfo.getAppPackageName(), flags);
ActivityInfo[] activities = packageInfo.activities;
if (activities != null && activities.length > 0) {
// 获取第一个activity,并启动
ActivityInfo activityInfo = activities[0];
String className = activityInfo.name;//From the "android:name" attribute.
Intent intent = new Intent();
intent.setClassName(clickAppInfo.getAppPackageName(), className);
startActivity(intent);
}
} catch (NameNotFoundException e) {
e.printStackTrace();
ToastUtils.showToastInThread(this, "没有找到入口的Activity~~~");
// 为啥抛异常:由于有些系统应用是c代码写的,所以会失败。
}
} |
问题1:空指针 分析:PackageManager.getPackageInfo()时,不会把整个清单文件给解析,因为消耗资源太高,这样解析可以节约内存。 只会解析常见的节点 解决:指定flags int flags = PackageManager.GET_ACTIVITIES; PackageInfo packageInfo = packageManager.getPackageInfo(clickAppInfo.getAppPackageName(), flags); |