运用scheme协议唤起外部app

最近所做的项目中有一个需要唤醒外部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 {
    @Override
    protected 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的注册文件中新增了用于被激活的过滤器。

            
                
                
                
                
                
                
                
                
            
        

以上两步便是被唤起的app进行所有操作了,后面便是主动唤起方的业务了。比如,如果是原生代码想唤起改界面的话,可以用下面的方法即可:

Intent intent=new Intent(Intent.ACTION_VIEW, Uri.parse("host0712://host0712#Intent;scheme=host0712;package=被唤起的app包名;end"));
startActivity(intent);

你可能感兴趣的:(Android应用开发,java)