> 文档中心 > Android开发-Android uri使用一例:一个app启动另外一个app,以及使用PackageManager中getLaunchIntentForPackage来进行App的信息的获取

Android开发-Android uri使用一例:一个app启动另外一个app,以及使用PackageManager中getLaunchIntentForPackage来进行App的信息的获取


内容简介:

本文探讨两个小功能的实现:

1. 如何由一个app(App1)启动另外一个app(App2)?
2. 在App2中,如何知道自己是被App1启动的?

1.  App1启动App2:

在Android应用程序开发时,如果想由一个App启动另外一个App,可以使用Uri这个类来实现。

Url - 统一资源定位符,位于android.net.Uri。可见,Uri是Android系统中才有的,事实上,Uri是Url的扩展。

一个App启动另外一个App非常容易实现,代码如下:

Intent intent = new Intent();ComponentName cn = new ComponentName("com.a.b.app1", "com.test.app2.activity.OneActivity");intent.setComponent(cn);Uri uri = Uri.parse("com.test.app2.activity.OneActivity");intent.setData(uri);context.startActivity(intent);

这样,就启动了App2的MainActivity了。

说明:
1). ComponentName的第一个参数是App2的包名,第二个参数是App2中的入口Activity;
2). Uri.parse的参数是App2的入口Activity;
2). 在App2中,AndroidManifest文件必须指定MAIN和LAUNCHER两个Action,声明如下:

          

2. 利用PackageManager中getLaunchIntentForPackage来进行App的信息的获取:

在App2中,如何知道自己是被App1启动的?可以通过PackageManager中getLaunchIntentForPackage方法来实现。代码如下:

PackageManager packageManager = getPackageManager();Intent intent =packageManager.getLaunchIntentForPackage("com.a.b.app1");if(intent!=null){    Toast.makeText(mContext,"Package found success!!!",Toast.LENGTH_SHORT).show();}else {    Toast.makeText(mContext,"Package not found!!!",Toast.LENGTH_SHORT).show();}

代码简单分析如下:

代码本身很简单,来看一下getLaunchIntentForPackage方法的具体实现。

PackageManager本身是一个抽象类,Android提供了

final class ApplicationPackageManager extends PackageManager 

可见,ApplicationPackageManager是PackageManager的派生类,而且不可以再被继承。

在ApplicationPackageManager中,getLaunchIntentForPackage方法的实现如下:

@Override    public Intent getLaunchIntentForPackage(String packageName) { // First see if the package has an INFO activity; the existence of // such an activity is implied to be the desired front-door for the // overall package (such as if it has multiple launcher entries). Intent intentToResolve = new Intent(Intent.ACTION_MAIN); intentToResolve.addCategory(Intent.CATEGORY_INFO); intentToResolve.setPackage(packageName); List ris = queryIntentActivities(intentToResolve, 0); // Otherwise, try to find a main launcher activity. if (ris == null || ris.size() <= 0) {     // reuse the intent instance     intentToResolve.removeCategory(Intent.CATEGORY_INFO);     intentToResolve.addCategory(Intent.CATEGORY_LAUNCHER);     intentToResolve.setPackage(packageName);     ris = queryIntentActivities(intentToResolve, 0); } if (ris == null || ris.size() <= 0) {     return null; } Intent intent = new Intent(intentToResolve); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setClassName(ris.get(0).activityInfo.packageName,  ris.get(0).activityInfo.name); return intent;    }

代码说明,

先通过Intent.ACTION_MAIN来查询app1的包名对应的Activity信息,

new Intent(Intent.ACTION_MAIN);  //设定了MAIN,

List ris = queryIntentActivities(intentToResolve, 0);

如果找不到,再主动设置ACTION_MAIN和CATEGORY_LAUNCHER,再查询:

intentToResolve.setPackage(packageName); //进行了包名的设置;

intentToResolve.addCategory(Intent.CATEGORY_LAUNCHER); //又设定了launcher。

ris = queryIntentActivities(intentToResolve, 0);

如果能找到对应的packageName,则返回相应的Intent;这样一来,在App2中,就可以根据这个Intent来获取相应的App1的信息了。