Android知识库高仿Appandroid开发实战专题

【从 0 开始开发一款直播 APP】1 高层封装之 Activi

2017-03-28  本文已影响785人  菜鸟窝

本文为菜鸟窝作者蒋志碧的连载。
菜鸟窝是专业的程序猿在线学习平台,提供最系统的 Android 项目实战课程
“从 0 开始开发一款直播 APP ”系列来聊聊时下最火的直播 APP,如何完整的实现一个类"腾讯直播"的商业化项目

一、概述

Activity 作为四大组件之首,其重要性可见一斑,为提高代码复用率和开发效率,封装必不可少。Activity 在开发中会重复很多操作:View 初始化、数据初始化、事件监听、ActionBar、设置布局、获取控件、吐司、页面跳转等。因此,这么多重复的工作,封装起来便可简单解决。

二、封装方法

新建 BaseActivity,将其改为抽象类,并继承 FragmentActivity,实现 onCreate() 方法

public abstract class BaseActivity extends FragmentActivity {
  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
  }
}

2.1 自定义 ActionBar

protected ActionBar mActionBar;
//设置setToolbar
protected abstract void setActionBar();  

2.2 页面跳转

public void invoke(Context context,Class clz){
    startActivity(new Intent(context,clz));
}

2.3 初始化数据

protected abstract void initData();

2.4 布局加载前的操作

protected void setBeforeLayout(){}

2.5 获取控件 Id (避免类型转换的繁琐,抽取 findViewById() )

public <T extends View> T obtainView(int resId){
    return (T)findViewById(resId);
}

2.6 简化 Toast ( Toast 运行在 UI 线程,这里使用 Handler 进行操作,也可以采用其他方式)

public void showToast(final int resId){
    mHandler.post(new Runnable() {
        @Override
        public void run() {
      Toast.makeText(BaseActivity.this,getString(resId),Toast.LENGTH_SHORT).show();
        }
    });
}

2.7 获取布局文件

protected abstract int getLayoutId();

2.8 设置监听

protected abstract void setListener();

2.9 重写 Activity 方法

 @Override
 protected void onPause() {
    super.onPause();
 }

 @Override
 protected void onDestroy() {
    super.onDestroy();
 }

 @Override
 protected void onResume() {
    super.onResume();
 }

2.10 方法调用(注意方法调用顺序)

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

    setBeforeLayout();
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    mContext = this;
    if (getLayoutId() != 0){
        setContentView(getLayoutId());
    }

    initView();
    initData();
    setActionBar();
    setListener();
}

三、Demo 演示 —— 闪屏页启动界面

3.1 闪屏页全屏显示

this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

3.2 闪屏页 3 秒动画后跳转

private void startAnimation() {
        AlphaAnimation animation = new AlphaAnimation(0.1f,1.0f);
        animation.setFillAfter(true);
        animation.setDuration(3000);
        animation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                invoke(SplashActivity.this,LoginActivity.class);
                //我们平时使用的App中,闪屏页均只出现一次,因此应结束当前Activity
                finish();
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
            }
        });

        mRlSplash.startAnimation(animation);
    }

3.3 闪屏页布局 activity_splash.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/rl_splash"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/splash_bg"
    tools:context="com.dali.admin.livestreaming.activity.SplashActivity">
</RelativeLayout>

3.4 代码合并

public class SplashActivity extends BaseActivity {
    private RelativeLayout mRlSplash;
  
    @Override
    protected void setListener() {
    }

    @Override
    protected void initData() {
    }
  
    @Override
    protected void setActionBar() {
    }

    @Override
    protected void initView() {
        mRlSplash = obtainView(R.id.rl_splash);
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        startAnimation();
    }

    private void startAnimation() {
        AlphaAnimation animation = new AlphaAnimation(0.1f,1.0f);
        animation.setFillAfter(true);
        animation.setDuration(3000);
        animation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                invoke(SplashActivity.this,LoginActivity.class);
                finish();
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
            }
        });
        mRlSplash.startAnimation(animation);
    }

    @Override
    protected int getLayoutId() {
        return R.layout.activity_splash;
    }
}

四、运行效果展示

五、总结

编码中遇到重复性工作将代码抽取封装成抽象类,提高代码复用率并提高效率

学习过程中遇到问题尽量自己解决,多查阅资料,会提高自己学习能力

学习本节需要对 Activity 的基本操作熟练掌握

更多内容,请关注菜鸟窝(微信公众号ID: cniao5),程序猿的在线学习平台。 欢迎勾搭小助手(lov730)加入高端技术交流群*
转载请注明出处,本文出自菜鸟窝,原文链接: http://www.cniao5.com/forum/thread/5cc8edfc0eee11e79ff800163e0230fa

上一篇下一篇

猜你喜欢

热点阅读