8***@qq.com
8***@qq.com
  • 发布:2021-11-05 14:31
  • 更新:2023-06-08 16:20
  • 阅读:3427

分享优化安卓端从点击app图标到显示启动页需要1-2秒延迟、卡顿的问题

分类:uni-app

这几天开始接触uniapp开发,发现官方demo安卓端点击app图标到显示启动页(Hbuildx图标页)会卡个1-2秒
明显比原生app体验差很多,作为一个强迫症,这点当然是不能忍的。具体问题详情查看以下链接:
https://ask.dcloud.net.cn/question/133649

先说下大概为什么卡顿的原因,我也不太明白,我猜是因为启动安卓app时需要启动webview或者weex等底层引擎导致的卡顿。(这个问题望官方的人可以解答一下,我看了PandoraEntry的源码也没有找到答案

下面说一下优化原理,就是用原生安卓代码先启动一个页面,然后在该页面中再启动uni的主activity(PandoraEntry)
这样,点击app图标后,就跟原生一样会立马显示我们原生开发的第一个页面(而不会卡个1、2秒才显示界面,让人感觉以为自己没点击图标成功)

下面说下流程

一、在AS中新建一个empty activity:菜单file->new->activity->empty activity。
界面xml代码:

<?xml version="1.0" encoding="utf-8"?>  
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:app="http://schemas.android.com/apk/res-auto"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    tools:context="com.xiefeng.MainActivity">  

</androidx.constraintlayout.widget.ConstraintLayout>

没什么东西,就是一个空白页面

java代码如下:

package com.xiefeng;  

import androidx.appcompat.app.AppCompatActivity;  

import android.content.Intent;  
import android.os.Bundle;  

import com.android.simple.R;  

import io.dcloud.PandoraEntry;  

public class MainActivity extends AppCompatActivity {  

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  

        Thread myThread=new Thread(){//创建子线程,启动uni的主activity  
            @Override  
            public void run() {  
                try{  
                    sleep(1000);//使程序休眠五秒  
                    Intent it=new Intent(MainActivity.this, PandoraEntry.class);//启动MainActivity  
                    startActivity(it);  
                    finish();//关闭当前活动  
                }catch (Exception e){  
                    e.printStackTrace();  
                }  
            }  
        };  
        myThread.start();//启动线程  
    }  
}

二、AndroidManifest.xml修改:
1、在android节点加上主题android:theme="@style/AppTheme2"
2、新增我们自定义的activity并设为main
3、将uni的主activity的main注释掉

完整代码如下:

<?xml version="1.0" encoding="utf-8"?>  
<manifest xmlns:android="http://schemas.android.com/apk/res/android"  
    package="com.android.simple">  

    <application  
        android:allowBackup="true"  
        android:allowClearUserData="true"  
        android:icon="@drawable/icon"  
        android:label="@string/app_name"  
        android:largeHeap="true"  
        android:supportsRtl="true"  
        android:theme="@style/AppTheme2">  

        <activity android:name="com.xiefeng.MainActivity">  
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />  
                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
        </activity>  

        <activity  
            android:name="io.dcloud.PandoraEntry"  
            android:configChanges="orientation|keyboardHidden|keyboard|navigation"  
            android:hardwareAccelerated="true"  
            android:label="@string/app_name"  
            android:launchMode="singleTask"  
            android:screenOrientation="user"  
            android:theme="@style/TranslucentTheme"  
            android:windowSoftInputMode="adjustResize">  
            <!--<intent-filter>  
                <action android:name="android.intent.action.MAIN" />  
                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
            -->  
        </activity>  
        <activity  
            android:name="io.dcloud.PandoraEntryActivity"  
            android:configChanges="orientation|keyboardHidden|screenSize|mcc|mnc|fontScale|keyboard|smallestScreenSize|screenLayout|screenSize"  
            android:hardwareAccelerated="true"  
            android:launchMode="singleTask"  
            android:permission="com.miui.securitycenter.permission.AppPermissionsEditor"  
            android:screenOrientation="user"  
            android:theme="@style/DCloudTheme"  
            android:windowSoftInputMode="adjustResize">  
            <intent-filter>  
                <category android:name="android.intent.category.DEFAULT" />  
                <category android:name="android.intent.category.BROWSABLE" />  

                <action android:name="android.intent.action.VIEW" />  

                <data android:scheme="h56131bcf" />  
            </intent-filter>  
        </activity>  

        <provider  
            android:name="io.dcloud.common.util.DCloud_FileProvider"  
            android:authorities="com.android.simple.dc.fileprovider"  
            android:exported="false"  
            android:grantUriPermissions="true">  
            <meta-data  
                android:name="android.support.FILE_PROVIDER_PATHS"  
                android:resource="@xml/dcloud_file_provider" />  
        </provider>  

        <meta-data  
            android:name="dcloud_appkey"  
            android:value="69ae588821d34380d31b94dd33dc0689" />  
    </application>  

</manifest>

三、最后在values/styles.xml加上主题:

<style name="AppTheme2" parent="Theme.AppCompat.Light.NoActionBar">  
        <item name="android:windowFullscreen">true</item>  
        <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>  
        <item name="android:windowDrawsSystemBarBackgrounds">false</item>  
        <item name="colorPrimary">#6200EE</item>  
        <item name="colorPrimaryDark">#6200EE</item>  
        <item name="colorAccent">#6200EE</item>  
    </style>

如果要加上自己的启动图片,可以加上节点:<item name="android:windowBackground">@drawable/splash</item>,并把图片放到drawable文件夹下。
建议原生启动图和Hbuildx设置的启动图为同一张,这样两张启动图无缝对接,体验比较好。
(注:加上启动图后启动会更慢个0.1秒不知道为什么,希望大神们解答一下)

完毕。

4 关注 分享
DCloud_Android_DQQ Dright Autukill haha2021a

要回复文章请先登录注册

彭彭丁满

彭彭丁满

回复 DCloud_Android_DQQ :
然尔并没有让APP打开快了多少,打开是快了,编译还是慢啊,领导都快把我逼疯了,也解决不了,性能稍差的手机空包打开都要3秒,打开后还要卡顿1-2秒后才出现加载的loading图
2023-06-08 16:20
彭彭丁满

彭彭丁满

回复 andylc :
只能自定义打包解决这个问题吗?下面回复说加自定义启动页可以解决这个问题,然尔并不起作用
2023-05-25 16:54
你滴羊驼

你滴羊驼

会有一个问题 导致plus.runtime.arguments永远获取为空
2022-04-26 11:49
Autukill

Autukill

这个方法是有效的
2022-03-23 17:44
DCloud_Android_DQQ

DCloud_Android_DQQ

回复 andylc :
是的。 解决办法就是在 启动图片展示之前 设置一个 windowBackground。 你可以通过搜索引擎了解一下相关知识
2021-12-30 19:37
andylc

andylc

回复 DCloud_Android_DQQ :
它是点了图标之后没有任何反应,开屏图片还没显示呢,等两秒后app才弹出来显示启动图片
2021-12-30 17:29
DCloud_Android_DQQ

DCloud_Android_DQQ

我猜是因为启动安卓app时需要启动webview或者weex等底层引擎导致的卡顿

你的解决办法是对的。 但是原因不是这个。

间隔时间长的原因很简单:就是用户点击launcher图标 到 首个activity给用户可见的时间间隔过长。

验证办法:你用原生应用,在首个activity里面集成很多东西,不做间隔处理,也会有这么长的间隔。

解决办法: 原生应用的一般解决办法是 在用户点击图标----到首个activity用户可见之间的window,设置一个windowBackground. 你的方案里其实最主要的就是这一点。

在hx3.1.1版本之后,支持设置自定义启动图的方式,来填充这个间隔的windowBackground. 你可以试试,尽可能靠近原生应用的效果。
2021-12-22 16:37
DCloud_Android_DQQ

DCloud_Android_DQQ

回复 andylc :
因为这个启动时间长的问题,可以通过设置开屏图片解决
2021-12-22 16:33
andylc

andylc

遇到相同的问题,我也奇怪为什么没有人问
2021-12-22 16:06