您当前的位置:首页 > 电脑百科 > 程序开发 > 移动端 > APP

App 启动速度优化系列:如何用一个placeholderUI来做初始化工作

时间:2022-07-13 12:25:22  来源:今日头条  作者:愿天堂没有代码

1,代码分析

因为App集成了Bugly, Push, Feedback等服务, 所以Application的onCreate有很多第三方平台的初始化工作

public class GithubApplication extends MultiDexApplication {

    @Override
    public void onCreate() {
        super.onCreate();

        // init logger.
        AppLog.init();

        // init crash helper
        CrashHelper.init(this);

        // init Push
        PushPlatform.init(this);

        // init Feedback
        FeedbackPlatform.init(this);

        // init Share
        SharePlatform.init(this);

        // init Drawer image loader
        DrawerImageLoader.init(new AbstractDrawerImageLoader() {
            @Override
            public void set(ImageView imageView, Uri uri, Drawable placeholder) {
                ImageLoader.loadWithCircle(GithubApplication.this, uri, imageView);
            }
        });
    }
}

2,调整Application onCreate再试

知道了哪些地方耗时长, 我们不妨调整下Application的onCreate实现, 一般来说我们可以将这些初始化放在一个单独的线程中处理, 为了方便今后管理, 这里我用了一个InitializeService的IntentService来做初始化工作

明确一点, IntentService不同于Service, 它是工作在后台线程的

InitializeService.JAVA代码如下:

package com.anly.githubapp.compz.service;

import Android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.NET.Uri;
import android.widget.ImageView;

import com.anly.githubapp.common.wrapper.AppLog;
import com.anly.githubapp.common.wrapper.CrashHelper;
import com.anly.githubapp.common.wrapper.FeedbackPlatform;
import com.anly.githubapp.common.wrapper.ImageLoader;
import com.anly.githubapp.common.wrapper.PushPlatform;
import com.anly.githubapp.common.wrapper.SharePlatform;
import com.mikepenz.materialdrawer.util.AbstractDrawerImageLoader;
import com.mikepenz.materialdrawer.util.DrawerImageLoader;

/**
 * Created by mingjun on 16/8/25.
 */
public class InitializeService extends IntentService {

    private static final String ACTION_INIT_WHEN_APP_CREATE = "com.anly.githubapp.service.action.INIT";

    public InitializeService() {
        super("InitializeService");
    }

    public static void start(Context context) {
        Intent intent = new Intent(context, InitializeService.class);
        intent.setAction(ACTION_INIT_WHEN_APP_CREATE);
        context.startService(intent);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        if (intent != null) {
            final String action = intent.getAction();
            if (ACTION_INIT_WHEN_APP_CREATE.equals(action)) {
                performInit();
            }
        }
    }

    private void performInit() {
        AppLog.d("performInit begin:" + System.currentTimeMillis());

        // init Drawer image loader
        DrawerImageLoader.init(new AbstractDrawerImageLoader() {
            @Override
            public void set(ImageView imageView, Uri uri, Drawable placeholder) {
                ImageLoader.loadWithCircle(getApplicationContext(), uri, imageView);
            }
        });

        // init crash helper
        CrashHelper.init(this.getApplicationContext());

        // init Push
        PushPlatform.init(this.getApplicationContext());

        // init Feedback
        FeedbackPlatform.init(this.getApplication());

        // init Share
        SharePlatform.init(this.getApplicationContext());

        AppLog.d("performInit end:" + System.currentTimeMillis());
    }
}

GithubApplication的onCreate改成:

public class GithubApplication extends MultiDexApplication {

    @Override
    public void onCreate() {
        super.onCreate();

        // init logger.
        AppLog.init();

        InitializeService.start(this);
    }
}

3,给我们的应用窗口弄一个PlaceHolder

Android最新的Material Design 建议我们使用一个placeholder UI来展示给用户直至App加载完毕

怎么做呢?

1>:给Window加上背景

当App没有完全起来时, 屏幕会一直显示一块空白的窗口(一般来说是黑屏或者白屏, 根据App主题)

这个空白的窗口展示跟主题相关, 那么我们是不是可以从首屏的主题入手呢? 恰好有一个windowBackground的主题属性, 我们来给Splash界面加上一个主题, 带上我们想要展示的背景。

做一个logo_splash的背景:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 底层白色 -->
    <item android:drawable="@color/white" />
    
    <!-- 顶层Logo居中 -->
    <item>
        <bitmap
            android:gravity="center"
            android:src="@drawable/ic_github" />
    </item>
</layer-list>

做一个主题:

<style name="SplashTheme" parent="AppTheme">
    <item name="android:windowBackground">@drawable/logo_splash</item>
</style>

2>:将一个什么也不渲染布局的Activity作为启动屏

写一个什么都不做的LogoSplashActivity

public class LogoSplashActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        // 注意, 这里并没有setContentView, 单纯只是用来跳转到相应的Activity.
        // 目的是减少首屏渲染
        
        if (AppPref.isFirstRunning(this)) {
            IntroduceActivity.launch(this);
        }
        else {
            MAInActivity.launch(this);
        }
        finish();
    }
}

在AndroidManifest.xml中设置其为启动屏, 并加上主题:

<activity
  android:name=".ui.module.main.LogoSplashActivity"
  android:screenOrientation="portrait"
  android:theme="@style/SplashTheme">
  <intent-filter>
      <action android:name="android.intent.action.MAIN"/>
      <category android:name="android.intent.category.LAUNCHER"/>
  </intent-filter>
</activity>

这种优化,对于有些Application内的初始化工作不能移到子线程做的情况, 是非常友好的;可以避免我们的App长时间的呈现给用户一个空白的窗口

有需要文中完整代码的同学 可以 私信发送 “底层源码” 即可 免费获取

现在私信还可以获得 更多《Android 学习笔记+源码解析+面试视频》

最后我想说:

对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们

技术是无止境的,你需要对自己提交的每一行代码、使用的每一个工具负责,不断挖掘其底层原理,才能使自己的技术升华到更高的层面

Android 架构师之路还很漫长,与君共勉



Tags:placeholderUI   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
App 启动速度优化系列:如何用一个placeholderUI来做初始化工作
1,代码分析因为App集成了Bugly, Push, Feedback等服务, 所以Application的onCreate有很多第三方平台的初始化工作public class GithubApplication extends MultiDexApplicati...【详细内容】
2022-07-13  Search: placeholderUI  点击:(406)  评论:(0)  加入收藏
▌简易百科推荐
如何构建基于大模型的App
ChatGPT 的出现让大模型再一次成为业界的关注热点,然而,并不是每个组织都要去训练及生成大模型的,而且各个组织的技术积累和计算资源也不太允许这样去做。更多的时候, 我们还是...【详细内容】
2023-09-27    喔家ArchiSelf  Tags:App   点击:(284)  评论:(0)  加入收藏
Google play应用成功上架要点——如何防止封号、拒审、下架?
Google Play是全球最大的移动应用商店之一,它是运行Android操作系统的设备的官方应用商店。它提供各种数字内容,包括应用程序(应用)、游戏、音乐、书籍等,包括免费和付费选项。这...【详细内容】
2023-08-18  Balen跨境说    Tags:Google play   点击:(269)  评论:(0)  加入收藏
微信公告将备案!App为何要备案?哪些需备案?怎样办理?
8月9日,微信公众平台运营中心发布了《关于开展微信小程序备案的通知》,表示微信公众平台ICP代备案管理系统将提供新增备案、变更备案、注销备案等服务,协助开发者完成微信小程...【详细内容】
2023-08-10    北京日报  Tags:   点击:(412)  评论:(0)  加入收藏
APP开发入门:了解主流的编程语言
在过去的几年里,有许多程序员开始学习和使用编程语言。这其中包括C、C++、 Java和 Python。尽管有许多语言可供选择,但大多数程序员都会选择最容易学习的编程语言。如今,有很多...【详细内容】
2023-07-28  爱尚网络科技    Tags:编程语言   点击:(179)  评论:(0)  加入收藏
App在线封装容易吗?是什么原理?
App在线封装是一种将网页应用封装成App的技术,通过这种技术,用户可以在不下载安装App的情况下,直接在浏览器中使用App的功能。相对于传统的App开发模式,App在线封装具有更低的开...【详细内容】
2023-06-30  李hh18122    Tags:App   点击:(242)  评论:(0)  加入收藏
APP原生开发和非原生的区别
我们都知道 APP开发的时候需要根据实际情况来选择合适的开发方式,而在 APP定制开发中要考虑功能、技术以及用户体验等多方面的问题,那么就有很多人会问到这个问题:APP原生开发...【详细内容】
2023-05-19  爱尚网络科技    Tags:APP原生开发   点击:(481)  评论:(0)  加入收藏
App开发中的人机交互:如何设计出符合人机交互原则的应用程序?
随着移动应用的普及,人们对于应用程序的期望也越来越高。一个优秀的App应用程序应该是易用、易学、易记和富有吸引力的,并且应该符合人机交互的基本原则。下面我们将详细讨论...【详细内容】
2023-05-17  跨境电商360  搜狐号  Tags:App开发   点击:(385)  评论:(0)  加入收藏
OA类APP的开发流程及注意事项
OA类APP的特点是方便交流,可以随时随地与同事进行工作上的沟通。尤其对于销售类的公司员工,移动APP非常符合他们的工作场景。他们经常出差或在外拜访客户,不方便在电脑上操作办...【详细内容】
2023-05-08  北京APP外包    Tags:APP   点击:(346)  评论:(0)  加入收藏
短视频app搭建的技术难点是什么?
近年来,短视频app的流行引起了广泛关注。越来越多的企业开始投入资源来开发短视频app,以满足用户的需求。然而,短视频app的开发过程中,存在许多技术难点需要解决。本文将深入分...【详细内容】
2023-04-24  玉柏科技勇哥说软件    Tags:app   点击:(275)  评论:(0)  加入收藏
短视频app搭建前需要注意哪些事项?
如果您正在考虑搭建一个短视频app,那么在开始之前,您需要注意以下几件事情:1. 确定您的目标受众在搭建短视频app之前,您需要确定您的目标受众。这将有助于您确定app的外观、功能...【详细内容】
2023-04-21  玉柏科技勇哥说软件    Tags:app   点击:(321)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条