作者丨HarryClaire
来源:
https://blog.csdn.net/wangzunkuan/article/details/95515175 最近所做的项目中有一个需要唤醒外部APP的功能,甲方要求在 接入是需要用scheme方式。为此,本人查了一些资料,在研究的基础上进行了开发。现总结如下:什么是scheme的唤起方式
首先,需要指出的是在客户端开发中,scheme是一种页面内跳转协议,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通过scheme协议,服务器可以定制化告诉App跳转那个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面等。它是通过URL的形式进行跳转的,主要可以进行两个层次的跳转: 1)同一应用内,原生页面唤起原生界面 或者 h5页面唤起原生界面; 2)两个独立的APP,一个APP原生或者h5唤起另一个APP的原生界面 下面说一下scheme协议的主要结构(我这边写的是原生app1唤起app2)$scheme$://$host$#Intent;scheme=$scheme$;package=$appId$;end
scheme: 具体的协议,这里可以自定义,只要双方约定好就行
host:端口号,这里也是要双方约定好即可
appId: 需要被唤起的应用的ID(这里注重说一下,最好不要用包名而是用APPID 否则可能唤起不了)
实际应用
第一步:在被唤起的APP中新建一个activity,作为被唤起的对象,专门用来处理唤起后的操作。public class WeekUpActivity extends Activity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);
goTopPage();
}/**
* 跳转到最近的界面
*/private void goTopPage() {
Class topClass = getTopActivityClass();if (topClass != null) {
Intent intent = new Intent(WeekUpActivity.this, topClass);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
WeekUpActivity.this.startActivity(intent);
} else {
Intent intent = new Intent(WeekUpActivity.this, SplashActivity.class);
WeekUpActivity.this.startActivity(intent);
}
finish();
}/**
* 获得栈中最顶层的Activity类
*
* @return
*/public Class getTopActivityClass() {
Class classTop = null;try {
Activity currentActivity = ActivitiesManager.getInstance().currentActivity();if (currentActivity.getClass().equals(WeekUpActivity.class)) {
Stack activityStack = ActivitiesManager.getInstance().getActivityStack();
Activity activity = activityStack.elementAt(activityStack.size() - 2);
classTop = activity.getClass();
} else {
classTop = currentActivity.getClass();
}
} catch (Exception e) {
e.printStackTrace();
}return classTop;
}
}
第二步:配置目标activity的过滤器
我写的这个activity主要是用来被唤起,然后跳转到应用最顶部的界面中去。那么如何被唤起呢,主要是在于该activity的注册文件中新增了用于被激活的过滤器。<activityandroid:name=".splash.WeekUpActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><dataandroid:host="home0712"android:scheme="host0712" />intent-filter>activity>
以上两步便是被唤起的app进行所有操作了,后面便是主动唤起方的业务了。比如,如果是原生代码想唤起改界面的话,可以用下面的方法即可:
Intent intent=new Intent(Intent.ACTION_VIEW, Uri.parse("host0712://host0712#Intent;scheme=host0712;package=被唤起的app包名;end"));
startActivity(intent);
版权声明:本文为CSDN博主「HarryClaire」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
推荐↓↓↓
长
按
关
注
?【16个技术公众号】都在这里!
涵盖:程序员大咖、源码共读、程序员共读、数据结构与算法、黑客技术和网络安全、大数据科技、编程前端、Java、Python、Web编程开发、Android、iOS开发、Linux、数据库研发、幽默程序员等。