内容简介:
本文探讨两个小功能的实现:
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,声明如下:<activity android:name="com.test.app2.activity.MainActivity" ...... > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
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<ResolveInfo> 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<ResolveInfo> 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的信息了。
1877



被折叠的 条评论
为什么被折叠?



