关于Android 程序跳转到 相应app的相关操作
示例代码
try {
PackageManager packageManager = getPackageManager();
Intent intent=new Intent();
intent = packageManager.getLaunchIntentForPackage("com.tencent.mm");
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
Intent viewIntent = new
Intent("android.intent.action.VIEW",Uri.parse("http://weixin.qq.com/"));
startActivity(viewIntent);
}
上面一段代码以微信为例实现的功能为:如果用户的手机上装有微信app,则直接打开微信app,否则跳转到相应的网页去下载微信app;
在Android的清单文件AndroidManifest.xm中我们知道一个Android程序有且只有一个包名,如果包名重复 版本号一致将无法安装app ,当包名一样版本号不一致,如果版本号高于用户当前安装程序的版本,将安装成功,反之失败。
intent是Android组件之间相互通信的依赖,
app之间的跳转实质就是activity之间的跳转,
上段代码中利用包名通过PackageManager类来获取微信的消息,进行分装成一个intent,这个intent就带有从当前的app跳转到微信的信息或者称消息。
通过startActivity(Intent intent)方法将带有当前的app跳转到微信的信息或者称消息的intent发送给Android底层,这样就实现了程序跳转到相应app的操作
如果说我们需要传递参数到微信app上上面的代码我们可以改成
try {
PackageManager packageManager = getPackageManager();
Intent intent=new Intent();
intent = packageManager.getLaunchIntentForPackage("com.tencent.mm");
intent.putExtra("name", "lipengchen");
intent.putExtra("birthday", "19940530");
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
Intent viewIntent = new
Intent("android.intent.action.VIEW",Uri.parse("http://weixin.qq.com/"));
startActivity(viewIntent);
}
这里我们添加了
intent.putExtra("name", "lipengchen");
intent.putExtra("birthday", "19940530");
两行代码,相当于将name = lipengchen 和 birthday =19940530的值给了intent
这样intent中就包涵了关键字为name值为lipengchen的消息或信息和关键字为birthday值为19940530的消息或信息。
假设我们可以操作微信app的代码如何去接受intent传过来的值呢?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
if (bundle != null) {
String name = bundle.getString("name");
String birthday = bundle.getString("birthday");
if (name != null && birthday != null) {
Toast.makeText(getApplicationContext(), "name:" + name + " birthday:" + birthday, Toast.LENGTH_SHORT).show();
}
}
}
上段代码中我们需要获取传递过来的intent及 Intent intent = getIntent();这段代码,
再通过关键字就能拿到我们传递过来的消息或信息
String name = bundle.getString("name");
String birthday = bundle.getString("birthday");
因为 intent.putExtra("name", "lipengchen")存放的值是放在Bundle类下的,所以我们要先拿到intent中的Bundle类对象bundle = intent.getExtras();
经过研究,必须每次都要打开启动的Activity才能接收到及MainActivity,因为传递过来的参数就是送到启动的Activity(android.intent.action.MAIN),在其他Activity怎么能拿到参数数据。所以必须每次跳转过来都要第一个打开启动的Activity,这是一种解决方法。如果我们知道跳转的相应的activity的类名也可以采用下面的代码来实现
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName cn = new ComponentName(packageName, className);
intent.setComponent(cn);
startActivity(intent);
ComponentName是用来打开其他应用程序中的Activity或服务的。
这里需要注意的是 在特定的activity的清单中需要写上如下的配置,action可以为空 也可以指定
<intent-filter>
<action android:name="" />
</intent-filter>
以上是关于Android程序跳转到相应app的相关操作的普通写法。
经过测试app 存在特殊情况:该app采用的是ionic框架 属于H5混合式开发,可以实现由该app跳转到其他源生app指定activity中,也可以由其他源生app跳转到该app,
该app可以向源生app传值,但接受由源生的传递过来的参数尚未解决,有待进一步研究,因为ionic只有一个activity 如果跳转到时ionic已经使用将显示的是ionic最后出现的界面。
如果要跳转到相应的App需要提供相应App的包名,如果需要向相应App传递参数则需要统一参数的键值。拿到值的相应操作在获取数据方App中实现。