[mobilesafe] 04_软件管理器——启动应用

Android 4.0

启动应用

技术点: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);