Android 进程间通信有很多方法,比如Android中进程间通信(IPC)方式总结
由于项目需求简单,只是由A App 调用并开启 B App 的登录界面,所以像那些方法有点大材小用.就用了下面的方法.
1. A App 中某处所要调用B App的方法
private void doStartApplicationWithPackageName(String packagename) {
// 通过包名获取此APP详细信息,包括Activities、services、versioncode、name等等
PackageInfo packageinfo = null;
try {
packageinfo = getPackageManager().getPackageInfo(packagename, 0);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
if (packageinfo == null) {
return;
}
// 创建一个类别为CATEGORY_LAUNCHER的该包名的Intent
Intent resolveIntent = getPackageManager().getLaunchIntentForPackage(packageinfo.packageName);// 这里的packname就是从上面得到的目标apk的包名
resolveIntent.putExtra("login", "123456"); // 所传递的值
// 启动目标应用
startActivity(resolveIntent);
}
2. 在B App的首页activity中接收 ("MAIN" Activity)
接收的方法和普通的一样,接收之后进行自己的业务逻辑
PS
这个方法只是开启B ,顺便传值.
还有一种方法是,在A 中调用B 的某个activity,直接显示在A 上 ,而不启动B ,简单说就像是A自己的页面一样.
A 中调用方法:
Intent i = new Intent("baihui.cn", Uri.parse("info://111"));
startActivity(i);
B 中被调用的Activity,清单文件中.过滤Intent
<activity android:name=".LoginActivity" >
<intent-filter>
<action android:name="baihui.cn" />
<data android:scheme="info"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
接收
Intent intent = getIntent();
if (intent != null && intent.getData()!= null) {
String s = intent.getData().toString().replace(intent.getScheme()+"://","");
}