ComponentName的使用

时间:2019-02-28
本文章向大家介绍ComponentName的使用,主要包括ComponentName的使用使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

ComponentName是安卓提供给我们的通过A应用启动B应用的一个类,与Intent同位于Android.content包下,这个类主要用来定义可见一个应用程序组件,例如:Activity,Service,BroadcastReceiver或者ContentProvider。
这是ComponentName的构造函数:ComponentName(String pkg,String cls)
在Android中详细描述一个组件,我们需要知道该组件所在的应用包名,也就是在AndroidManifest.xml文件中manifest根结点下的package=“com.XXXXX.XXXXX",还有组件在应用程序中的完整路径名,拿Activity来说,也就是activity节点中name属性的值,如

mActivityName = "com.XxX.XXX.activity.diagnose.DiagnoseActivity"

所以ComponentName可以用来封装一个组件的应用包名和组件的名字

我们已经知道,在Android中组件之间的交流往往使用意图(Intent)来完成的,那么在Intent中有一个方法可以封装一个ComponentName,最后我们在使用意图去完成我们需要实现的功能。下面来讲一下ComponentName如何使用。

Android 开发有时需要在一个应用中启动另一个应用,比如Launcher加载所有的已安装的程序的列表,当点击图标时可以启动另一个应用。一般我们知道了另一个应用的包名和MainActivity的名字之后便可以直接通过如下代码来启动(其中className是指完整的类名):
启动目标APP的主页面

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);            
ComponentName cn = new ComponentName(packageName, className);            
intent.setComponent(cn);
startActivity(intent);

启动目标APP的内部普通页面

      ComponentName cn = new ComponentName(mPackageName, mActivityName);
        try {
            Intent intent = new Intent();
            Bundle bundle = new Bundle();
            bundle.putString("type", "1");//传递值
            intent.putExtras(bundle);
            intent.setComponent(cn);
            startActivityForResult(intent, REQUEST_ID);//等待目标页面返回的结果
        } catch (Exception e) {
            e.printStackTrace();
        }

但是有的时候,我们一般都不知道应用程序的启动Activity的类名,而只知道包名,我们可以通过ResolveInfo类来取得启动Acitivty的类名。

    private void openApp(String packageName) {
        PackageInfo pi = getPackageManager().getPackageInfo(packageName, 0);

        Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
        resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        resolveIntent.setPackage(pi.packageName);

        List<ResolveInfo> apps = pm.queryIntentActivities(resolveIntent, 0);

        ResolveInfo ri = apps.iterator().next();
        if (ri != null) {
            String packageName = ri.activityInfo.packageName;
            String className = ri.activityInfo.name;

            Intent intent = new Intent(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_LAUNCHER);

            ComponentName cn = new ComponentName(packageName, className);

            intent.setComponent(cn);
            startActivity(intent);
        }
    }

转载自:https://blog.csdn.net/u012532559/article/details/52766348