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的信息了。