全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android跨应用启动实例详解

Android跨应用启动

前言:

相信大家,很多时候都是在自己的应用中,启动自己写的Activity,Service、BroadcastReceiver、contentProvider 。换句话说,这些都只是 * 单个应用中 组件间 * 的启动。而我们下面要谈论的是 两个应用间 组件 的启动。即——使用 隐式Intent方式 启动应用B的某个组件。

一、在开始之前,先来梳理一下跨应用启动的2种方式:

第一种:在Activity中,启动另一个app的组件。

第二种:在Service中,启动另一个app的组件。

从所周知,Android中有四大组件,那么为什么小编,只介绍Activity和Service中启动另一个应用的四大组件?

其实,BroadcastReceiver组件也是可以启动 4大组件的。这是因为onReceive()方法中会要求传入context实例,有了context实例,就能使用context的方法,启动其他组件。

至于contentProvider,我想大家还没见过,这娃自动去干过事情吧,都是被动的调用。

所以在写代码的时候,我们经常会在Activity或者Service中去启动一个组件,BroadcastReceiver很少,而contentProvider更是没见过。

另外需要跟大家说一下,Context类是一个抽象类,传入的context实例是由其子类来实现的,这种——用父类声明变量,由子类来实现的思维方式,在Java中是很常见的。特别是接口和抽象类,经常用到这种方式。对于小编这种由C转Java的人来说,真是一大坑啊。

为什么Activity和Service都可以直接使用图中的四个方法呢,这是因为Activity和Service都是继承自ContextWrapper,所以子类拥有父类的方法。BroadcastReceiver和contentProvider则不是,具体大家可以看官方API。

二、跨应用启动的实战

** 下面让我们正式进入今天的主题:跨应用启动实战**

1:AppA的Activity中,启动AppB的Activity

Android提供了在一个App中启动另一个App中的Activity的能力,这使我们的程序很容易就可以调用其他程序的功能,从而就丰富了我们App的功能。比如在微信中发送一个位置信息,对方可以点击这个位置信息启动腾讯地图并导航。这个场景在现实中作用很大,尤其是朋友在陌生的环境找不到对方时,这个功能简直就是救星。

本来想把本文的名字叫启动另一个进程中的Activity。因为每个App都会运行在自己的虚拟机中,每个虚拟机跑在一个进程中。但仔细一想,能够称为一个进程,前提是这个App必须要运行起来才行。而Android提供的能力,是不需要另一个App启动就可以将其特定的Activity启动起来的。

也就是说B应用是处理未启动的状态,也就是还没有成为系统的一个进程,那么当使用A启动B应用的某个组件时,请问,B应用是否成为系统的进程?答案是yes。怎么看呢,可以从Android Studio 的Android device monito 中结合虚拟机看。

我们有至少两种办法达到启动另一个App中的Activity。

第一种———隐式Intent的action方式。

相信这种方式,大家都不会陌生。这里就不进行过多的解析。这里只贴一下AppB的manifest(文件清单):

从文件清单中,我们可以看到,appB中有两个Activity。其中SecondActivity就是要被appA启动的Activity。
那么我们只要在appA的任意一个组件(Activity或Service),做如下的调用:

Intent intent=new Intent("android.intent.action.SecondActivity");
startActivity(intent);

就可以成功在 A应用中 启动B应用的 组件。另外还要跟大家说一点,SecondActivity的category一定要在文件清单中添加上,否则启动的时候会报错的。

不知道大家有没有思考过这三个事情: 
1、当A应用 启动 B应用的SecondActivity,那么B应用的MainActivity会不会被启动呢?正常情况下,我们点击应用B,进到的是MainActivity这个活动,那么现在我们是通过跨应用启动,会不会要经过B的MainActivity呢?答案是不会。

2、当我们在SecondActivity中点击Back回退键时,回到的是A应用的mainActivity界面,这里时候大家有没有想过。 
SecondActivity和appA的mainActivity是不是同处于一个栈中呢?这时候就要去打印栈的ID了。

3、由上面的两件事,不知道大家想起:Android对于Activity的管理,也就是framework层的ActivityManager。也就是说,你手机上的N多应用,当你打开某一个应用是,这个应用的Activity都是由ActivityManager这娃来创建和管理的。应用本身并没有创建Activity的能力。当然这其中又涉及到了Ibinder的通讯。这里暂时不讲。

第二种用intent设置className或component的办法启动。举例如下。

新建两个项目ProjectA和ProjectB,用B中的MainActivity启动A的MainActivitity。关键代码如下:

ProjectA MainActivity

@Override
 public void onClick(View v) {
 Intent intent = new Intent(Intent.ACTION_VIEW);
 String packageName = "com.example.mylife.anotherapp";
 String className = "com.example.mylife.anotherapp.MainActivity";
 intent.setClassName(packageName, className);
 //second method
 //intent.setComponent(new ComponentName("com.example.mylife.anotherapp","com.example.mylife.anotherapp.MainActivity"));
 Bundle bundle = new Bundle();
 bundle.putString("msg", "this message is from project B ");
 intent.putExtras(bundle);
 intent.putExtra("pid", android.os.Process.myPid());
 startActivityForResult(intent, 1);
 //startActivity(intent);
 }

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 super.onActivityResult(requestCode, resultCode, data);
 switch (requestCode) {
 case 1:
 if(resultCode == RESULT_OK) {
 textView.setText(data.getStringExtra("result"));
 }
 break;
 }
 }

ProjectB MainActivity

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 textView = (TextView)findViewById(R.id.text);

 Intent intent = getIntent();
 if(intent != null) {
 textView.setText(intent.getStringExtra("msg"));
 }
 }

 public void OnClick(View view) {
 Intent intent = new Intent();
 intent.putExtra("result","OK! from project a.");
 this.setResult(RESULT_OK,intent);
 this.finish();//要清楚这里为什么要用finish()。
 }

注意:如果在应用B中,是通过按下Back键,回退到应用A的MainActivity活动,那么A的onActivityResult()方法是不会被回调的,这是因为ProjectB的MainActivity活动只是出栈而已,并没有销毁。而只有ProjectB的MainActivity活动被销毁的时候,才会回调A的onActivityResult()方法。那如果是按了Back键回退的话怎么处理呢?这时候只要重写appB的onBackPressed()方法就好了。

@Override
public void onBackPressed() {
 super.onBackPressed();
 Intent intent = new Intent();
 intent.putExtra("result","OK! from project a.");
 this.setResult(RESULT_OK,intent);
 this.finish();//要清楚这里为什么要用finish()。
}

二:进阶———在A应用的Activity中启动(停止)——B应用的服务

应用B的manifest

应用B的service的代码:

public class MyService extends Service {

 private static final String TAG = "MyService";
 public MyService() {
 }

 @Override
 public IBinder onBind(Intent intent) {
 // TODO: Return the communication channel to the service.
 throw new UnsupportedOperationException("Not yet implemented");
 }

 @Override
 public void onCreate() {
 super.onCreate();
 Log.d(TAG, "onCreate: ");
 }

 @Override
 public int onStartCommand(Intent intent,int flags, int startId) {
 Log.d(TAG, "onStartCommand: ");
 if(intent != null) {
 Log.d(TAG, "onStartCommand: "+intent.getStringExtra("msg"));
 }
 return super.onStartCommand(intent, flags, startId);

 }

 @Override
 public void onDestroy() {
 super.onDestroy();
 Log.d(TAG, "onDestroy: ");
 }
 }

应用A的代码:

@Override
 public void onClick(View v) {
 Intent intent = new Intent(Intent.ACTION_VIEW);
 String packageName = "com.example.mylife.anotherapp";
 String className = "com.example.mylife.anotherapp.MyService";
 intent.setClassName(packageName, className);

 switch (v.getId()) {
 case R.id.btn_start:
 Bundle bundle = new Bundle();
 bundle.putString("msg", "this message is from project B ");
 intent.putExtras(bundle);
 intent.putExtra("pid", android.os.Process.myPid());
 startService(intent);
 break;
 case R.id.btn_stop:
 stopService(intent);
 break;
 }
 }

测试结果:A应用直接启动B应用的服务,而B应用并不会打开自己的Activity。

本次代码参考://www./article/111896.htm

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Android跨应用启动  # Android 跨应用  # 自己的  # 的是  # 子类  # 都是  # 这是因为  # 就可以  # 是由  # 中有  # 要用  # 周知  # 来实现  # 回调  # 第二种  # 小编  # 第一种  # 的人  # 是一个  # 进阶  # 也就是说  # 这时候 


相关文章: 专业网站建设制作报价,网页设计制作要考什么证?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  如何快速搭建支持数据库操作的智能建站平台?  如何使用Golang table-driven基准测试_多组数据测量函数效率  建站之星代理如何获取技术支持?  沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?  如何通过老薛主机一键快速建站?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  如何在云主机上快速搭建网站?  建站中国官网:模板定制+SEO优化+建站流程一站式指南  定制建站是什么?如何实现个性化需求?  相册网站制作软件,图片上的网址怎么复制?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  详解jQuery停止动画——stop()方法的使用  如何在云服务器上快速搭建个人网站?  建站之家VIP精选网站模板与SEO优化教程整合指南  C++中引用和指针有什么区别?(代码说明)  成都网站制作公司哪家好,四川省职工服务网是做什么用?  如何在IIS7上新建站点并设置安全权限?  微课制作网站有哪些,微课网怎么进?  视频网站app制作软件,有什么好的视频聊天网站或者软件?  如何高效利用200m空间完成建站?  制作网站的公司有哪些,做一个公司网站要多少钱?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  代刷网站制作软件,别人代刷火车票靠谱吗?  建站主机服务器选购指南:轻量应用与VPS配置解析  网站制作话术技巧,网站推广做的好怎么话术?  文字头像制作网站推荐软件,醒图能自动配文字吗?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  Python路径拼接规范_跨平台处理说明【指导】  建站之星代理费用多少?最新价格详情介绍  Swift中swift中的switch 语句  ,石家庄四十八中学官网?  如何在服务器上三步完成建站并提升流量?  内网网站制作软件,内网的网站如何发布到外网?  智能起名网站制作软件有哪些,制作logo的软件?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  定制建站策划方案_专业建站与网站建设方案一站式指南  建站之星会员如何解锁更多建站功能?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  如何自定义建站之星网站的导航菜单样式?  如何高效配置香港服务器实现快速建站?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  网站制作公司,橙子建站是合法的吗?  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  如何快速搭建个人网站并优化SEO?  如何通过西部建站助手安装IIS服务器? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。