uni-app 离线打包APP套壳安卓原生对接代理平台时切换APP会进行两次初始化操作并启动两次代理

uni-app 离线打包APP套壳安卓原生对接代理平台时切换APP会进行两次初始化操作并启动两次代理

操作步骤:

打开我们的app,第一次会启动代理,这时候,息屏、打开摄像头、或者打开任务栏切换app,类似遮盖住app,再次进入app,代理就会启动第二次。 打开我们的app,返回到桌面,再点击桌面的app图标进入到app中,就不会启动第二次代理初始化,经过这个操作之后,app无论怎么操作,都不会再进行代理初始化操作了。

预期结果:

当息屏或者打开摄像头等一系列遮盖住app的操作之后,再进入到我们的app中,代理方法不会执行第二次初始化

实际结果:

bug描述:

我们开发的一款uniapp离线打包,套壳app程序因为需要访问内部数据库,所以用了一个代理平台(移动安全门户(简称:emm),代理平台的对接只能使用安卓源生来对接。 现在产生问题,切换到任务栏,或者遮盖住了app,再进入到app中,写在app初始化中的代理初始化操作会启动两次。就造成了断网的问题。如果手机操作直接上划到桌面再点击桌面的app进入到app中,就不会再次启动代理初始化了。 我们用安卓源生写了一个简易的测试程序对接了代理sdk不会产生问题(再次进入app不会执行安卓源生中写的代理初始化的方法) 我们用hbuilderX创建了一个uniapp,简易写了一个请求方法,再次离线打包,放进我们新创建的安卓原生项目再次对接了sdk,就出现了问题了。 问题出现在:安卓源生的初始化声明周期中所有的方法都只会执行一次,代理的初始化那段代码也只会执行一次,我们的uniapp集成进去之后,安卓源生的方法只会在第一次启动app的时候执行一次,切换app不会执行第二次,但是 代理的初始化方法会执行第二次。 详情看代码中的“第一次启动代理”只会执行一次,但是下面的初始化方法会执行两次。

信息类别 信息内容
产品分类 uniapp/App
PC开发环境 Windows
PC开发环境版本 22H2
HBuilderX类型 正式
HBuilderX版本 3.6.18
手机系统 Android
手机系统版本 Android 9.0
手机厂商 华为
手机机型 sunmi l2s
页面类型 vue
vue版本 vue2
打包方式 离线
项目创建方式 HBuilderX

Image Image


更多关于uni-app 离线打包APP套壳安卓原生对接代理平台时切换APP会进行两次初始化操作并启动两次代理的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app 离线打包APP套壳安卓原生对接代理平台时切换APP会进行两次初始化操作并启动两次代理的实战教程也可以访问 https://www.itying.com/category-93-b0.html


在 uni-app 离线打包的安卓原生应用中,如果你在切换应用时遇到应用进行两次初始化操作并启动两次代理的问题,可能是由于以下几个原因导致的。以下是一些可能的解决方案:

1. 生命周期管理问题

  • 原因:在安卓原生开发中,应用的生命周期管理非常重要。如果在 onCreateonResume 等生命周期方法中进行了代理的初始化操作,可能会导致在应用切换时重复执行这些操作。
  • 解决方案:确保代理的初始化操作只在应用启动时执行一次,而不是在每次应用切换时都执行。你可以在 onCreate 方法中进行初始化,并在 onResume 中避免重复初始化。
[@Override](/user/Override)
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 初始化代理
    initProxy();
}

[@Override](/user/Override)
protected void onResume() {
    super.onResume();
    // 避免重复初始化
}

2. Activity 启动模式

  • 原因:如果应用的 Activity 启动模式设置为 singleTasksingleInstance,可能会导致在应用切换时重新创建 Activity,从而触发初始化操作。
  • 解决方案:检查 AndroidManifest.xml 文件中的 Activity 启动模式,确保它不会导致 Activity 在应用切换时重新创建。
<activity
    android:name=".MainActivity"
    android:launchMode="standard">
</activity>

3. 代理服务的单例模式

  • 原因:如果代理服务没有使用单例模式,可能会导致每次应用切换时都创建一个新的代理实例。
  • 解决方案:确保代理服务使用单例模式,这样即使应用切换,也不会重复创建代理实例。
public class ProxyManager {
    private static ProxyManager instance;

    private ProxyManager() {
        // 初始化代理
    }

    public static synchronized ProxyManager getInstance() {
        if (instance == null) {
            instance = new ProxyManager();
        }
        return instance;
    }
}

4. 应用后台运行时的处理

  • 原因:当应用切换到后台时,安卓系统可能会暂停或销毁应用的部分资源。当应用再次回到前台时,可能会重新初始化这些资源。
  • 解决方案:在 onPauseonStop 方法中,检查是否需要释放或暂停代理服务,并在 onResume 方法中恢复。
[@Override](/user/Override)
protected void onPause() {
    super.onPause();
    // 暂停或释放代理服务
}

[@Override](/user/Override)
protected void onResume() {
    super.onResume();
    // 恢复代理服务
}

5. 调试和日志

  • 原因:如果不确定问题的具体原因,可以通过添加日志来调试应用的初始化流程。
  • 解决方案:在关键的生命周期方法中添加日志,观察应用切换时的行为。
[@Override](/user/Override)
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d("MainActivity", "onCreate called");
    initProxy();
}

[@Override](/user/Override)
protected void onResume() {
    super.onResume();
    Log.d("MainActivity", "onResume called");
}
回到顶部