# 独立进程页面支持

虽然现在支持单个进程运行多个不同的 core 版本,但还是有些 core 版本不支持与其他 core 同进程运行,所以需要新的进程去运行。

使用mMainPageProxy.setJSViewController()接口去实现启动独立进程小程序:

public class MainActivity extends AppCompatActivity {
    private MainPageProxy mMainPageProxy;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mMainPageProxy = new MainPageProxy(this);
        mMainPageProxy.onCreate(savedInstanceState);

        /**
         * 添加新进程运行小程序的能力。由于 {@code DefaultJSViewController} 需要{@code JSViewParent}对象
         * ,所以需要在 {@code mMainPageProxy.onCreate} 之后调用。
         */
        mMainPageProxy.setJSViewController(new DefaultJSViewController(mMainPageProxy.getJSViewParent()) {

            /**
             * 当需要新开一个进程时这个方法会被调用。
             * 比如 js 里使用 openWindow() 打开一个小程序,如果 sdk 发现这个小程序的 core 需要使用新的进程才能运行,就会调用这个方法
             * @param miniAppParams 小程序的启动参数
             * @return 是否成功启动新进程
             */
            @Override
            public boolean openMiniAppInNewTab(MiniAppParams miniAppParams) {
                try {
                    // 启动独立进程的 activity
                    Intent intent = new Intent(mJSViewParent.getContext(), MySubPageActivity.class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    // 传入小程序启动参数
                    intent.putExtras(miniAppParams.toBundle());
                    mJSViewParent.getContext().startActivity(intent);
                }catch (Exception e){
                    e.printStackTrace();
                    return false;
                }

                return true;
            }
        });

    }

    ...

}
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

MySubPageActivity.java 代码示例:

package com.example.jsviewsample;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Process;
import android.view.KeyEvent;

import com.tvcode.js_view_app.DefaultJSViewController;
import com.tvcode.js_view_app.MainPageProxy;
import com.tvcode.js_view_app.bean.MiniAppParams;

public class MySubPageActivity extends Activity {
    protected MainPageProxy mMainPageProxy = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mMainPageProxy = new MainPageProxy(this);
        // 设置dev tools的端口,默认不设置的话端口是9326
        mMainPageProxy.setDebugPort(9376);
        mMainPageProxy.onCreate(savedInstanceState);

        mMainPageProxy.setJSViewController(new DefaultJSViewController(mMainPageProxy.getJSViewParent()) {
            @Override
            public boolean openMiniAppInNewTab(MiniAppParams miniAppParams) {
                // TODO 如果这个进程也想有再开新进程的能力,就在这实现
                return false;
            }
        });
    }


    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        if(mMainPageProxy != null) {
            mMainPageProxy.onNewIntent(intent);
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        if(mMainPageProxy != null)
            mMainPageProxy.onStart();
    }

    @Override
    protected void onResume() {
        super.onResume();
        if(mMainPageProxy != null)
            mMainPageProxy.onResume();
    }

    @Override
    protected void onPause() {
        if(mMainPageProxy != null)
            mMainPageProxy.onPause();
        super.onPause();
    }

    @Override
    protected void onStop() {
        if(mMainPageProxy != null)
            mMainPageProxy.onStop();
        super.onStop();
    }

    @Override
    protected void onDestroy() {
        if(mMainPageProxy != null)
            mMainPageProxy.onDestroy();
        super.onDestroy();
        Process.killProcess(Process.myPid());
    }


    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        if(mMainPageProxy !=null && mMainPageProxy.dispatchKeyEvent(event))
            return true;

        return super.dispatchKeyEvent(event);
    }
}

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

最后记得在AndroidManifest.xml注册 activity:

<activity android:name=".MySubPageActivity"
    android:process=":subpage1"
    android:launchMode="singleInstance"
    android:theme="@style/SplashThemeType0"/>
1
2
3
4
Last Updated: 8/6/2024, 10:13:48 AM