开发

嵌入式小程序——Android使用指南

嵌入式小程序是百度智能小程序的一种view运行形态,宿主开发者可以在宿主app合适的位置中内嵌该小程序视图,让小程序更好的和宿主app融合在一起。本文介绍了在接入了小程序SDK后,嵌入式小程序的实现流程。

前置条件

  • 小程序SDK >= 2.38.0

嵌入式小程序使用

下面介绍Android客户端嵌入视图小程序的整体实现流程:
第一步,创建嵌入式小程序承载视图;第二步,同步宿主Activity生命周期到嵌入式小程序视图;第三步,加载嵌入式小程序;

1. 创建嵌入式小程序承载视图

小程序SDK为宿主提供了SwanAppEmbedView,其可以通过new对象的方式或者在xml文件布局的方式进行创建。

  1. new SwanAppEmbedView(activity)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class EmbedActivity extends Activity implements ActivityResultDispatcherHolder {
    /** 小程序嵌入视图 */
    private SwanAppEmbedView mSwanAppEmbedView;
    /**
    * 初始化嵌入式小程序视图
    */
    private void initEmbedView() {
    mSwanAppEmbedView = new SwanAppEmbedView(MainActivity.this);
    mSwanAppEmbedView.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
    mRootView.addView(mSwanAppEmbedView);
    }

    ······
    }
  2. xml文件布局

布局:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  <com.baidu.swan.apps.embed.view.SwanAppEmbedView
android:id="@+id/embedView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
```
使用:
```java
public class EmbedActivity extends Activity implements ActivityResultDispatcherHolder {
/** 小程序嵌入视图 */
private SwanAppEmbedView mSwanAppEmbedView;
/**
* 初始化嵌入式小程序视图
*/
private void initEmbedView() {
mSwanAppEmbedView = findViewById(R.id.embedView);
}

······
}

2. 同步宿主Activity生命周期到嵌入式小程序视图

为了保证小程序的正常运行,该嵌入式小程序视图的一些生命周期方法需要在宿主的activity进行调用,以宿主Activity为EmbedActivity为例,(注:需要实现ActivityResultDispatcherHolder接口),如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
public class EmbedActivity extends Activity implements ActivityResultDispatcherHolder {
/** 小程序嵌入视图 */
private SwanAppEmbedView mSwanAppEmbedView;
/**
* 初始化嵌入视图,在需要使用的地方初始化即可,也可以直接在xml文件进行布局占位。
*/
private void initEmbedView() {
mSwanAppEmbedView = new SwanAppEmbedView(this);
}
@Override
protected void onStart() {
super.onStart();
if(mSwanAppEmbedView !=null){
mSwanAppEmbedView.onStart();
}
}
@Override
protected void onStop() {
super.onStop();
if(mSwanAppEmbedView !=null){
mSwanAppEmbedView.onStop();
}
}
@Override
protected void onResume() {
super.onResume();
if(mSwanAppEmbedView !=null){
mSwanAppEmbedView.onResume();
}
}
@Override
protected void onPause() {
super.onPause();
if(mSwanAppEmbedView !=null){
mSwanAppEmbedView.onPause();
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (mSwanAppEmbedView !=null && mSwanAppEmbedView.onKeyDown(keyCode, event)) {
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public void onBackPressed() {
if (mSwanAppEmbedView !=null && mSwanAppEmbedView.onBackPressed()) {
return;
}
super.onBackPressed();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (mSwanAppEmbedView !=null && mSwanAppEmbedView.onActivityResult(requestCode, resultCode, data)) {
return;
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if(mSwanAppEmbedView !=null){
mSwanAppEmbedView.onConfigurationChanged(newConfig);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(mSwanAppEmbedView !=null){
mSwanAppEmbedView.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
if(mSwanAppEmbedView !=null){
mSwanAppEmbedView.onTrimMemory(level);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if(mSwanAppEmbedView !=null){
mSwanAppEmbedView.onDestroy();
}
}
@Nullable
@Override
public ActivityResultDispatcher getResultDispatcher() {
if(mSwanAppEmbedView !=null){
return mSwanAppEmbedView.getResultDispatcher();
}
// 如果有宿主实现,可以走宿主的实现
return null;
}
}

3. 加载嵌入式小程序

通过调用嵌入式小程序视图的loaApp(scheme, activity)方法,加载指定小程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class EmbedActivity extends Activity implements ActivityResultDispatcherHolder {
/** 小程序嵌入视图 */
private SwanAppEmbedView mSwanAppEmbedView;
/**
* 初始化嵌入式小程序视图
*
* @param launchScheme 指定小程序的scheme
*/
private void loadEmbedApp(String launchScheme) {
mSwanAppEmbedView.loadApp(launchScheme, this);
}

······
}

注意事项

  • SwanAppEmbedView同一进程只支持展示一个,如果存在多个SwanAppEmbedView实例,最新loadApp的实例会展示对应内容,其他SwanAppEmbedView里面的页面内容会被自动销毁。
  • 8.0的手机存在系统bug,不支持透明主题的activity进行setRequestedOrientation操作,否则崩溃,如果宿主activity采用了透明主题,需适配8.0手机。