1.InitApp==>项目的入口Application

1.1.继承了MultiDexApplication

  超过65K方法的APP,会遇到65535的错误。原因就是为了支持比较大型的APP而产生。

  参考文章:Android分包MultiDex原理详解。

1.2.在build.gradle中修改multiDexEnabled

  

  然后记得在dependencies中加:

  implementation 'com.android.support:multidex:1.0.2'

1.3.用第三方库facebook的开源调试工具==Stetho

  参考文章:Stetho简化Android调试

  作用:可以用谷歌浏览器调试手机,获得非常详细的数据。

  具体方式,参考上面文章。

  下面讲解这个项目是如何使用的。

  封装好这个SdkManager,主要就是为了初始化Stetho。

  

  第二个函数涉及到了OkHttpClient

  参考这篇文章了解HttpLoggingInterceptor。

  HttpLoggingInterceptor该拦截器用于记录应用中的网络请求的信息。

  因为这里只有调试的时候才会用到这个工具,所以在src目录下创建了两个包,名字相同。

  一个叫做debug,一个叫做release。

  然后在build.gradle中也做相应的改变==>

  debugCompile 'com.facebook.stetho:stetho:1.5.0'

  debugImplementation 'com.squareup.okhttp3:logging-interceptor:3.9.0'

  implementation 'com.squareup.okhttp3:okhttp:3.9.0'

1.4.BuildConfig:Gradle自定义你的BuildConfig

  参考文章:BuildConfig:Gradle自定义你的BuildConfig

  

  直接在buildTypes中修改或添加一些属性。

  BuildType是系统直接产生的一个类,可以判断当前应用是Debug模式还是release模式。

1.5.Android Studio 配置Gradle

  参考文章:Android Studio 配置Gradle(包括signingConfigs、buildTypes、重命名等)。

  

  在build.gradle中声明一个函数,获取当前时间。

  

  生成apk文件重命名。

2.启动页设置

2.1.新建一个启动页

  

2.2.配置清单

  

  参考这篇文章了解android:configChanges的作用。

  orientation==>屏幕方向改变了。

  screenSize==>屏幕大小改变了。

  uiMode==>用户的模式发生了变化。

  切屏还是会重新调用各个生命周期,切横屏、竖屏只会执行一次。

2.3.设置android:theme主题

  

  在styles.xml文件中加上一个主题风格,用作启动页的主题。

  用android:windowBackground来设置主题背景。

2.4.drawable文件夹中新建一个样式

  

  第一个item是背景颜色。

  第二个item将中心点设置为logo。

3.BaseActivity使用rxlifecyle框架

3.1.使用原因

  实际的项目中会出现很多订阅关系,那么取消订阅的代码也就越来越多。造成了项目很难维护。所以我们必须寻找

  其他可靠简单可行的方式。

  github地址:https://github.com/trello/RxLifecycle

3.2.使用方法

  在build.gradle中添加引用

  implementation 'com.trello.rxlifecycle2:rxlifecycle:2.0.1'

  implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.0.1'

3.3.然后将BaseActivity继承RxAppCompatActivity即可。

4.滑动切换Activity使用Slidr框架

4.1.效果预览

  参考文章:滑动切换Activity。

  github地址:https://github.com/r0adkll/Slidr

  

4.2.导入Slidr到项目

  先在build.gradle添加==>

  compile 'com.r0adkll:slidableactivity:2.0.5'

4.3.Slidr使用

  需要准备两个Activity,唯一需要注意的是Activity的Theme需要重写下面的代码

  

  然后需要在两个Activity的布局文件中的最顶层的Layout中,为Activity设置背景(否则Activity会是透明的)

  

  然后在代码中配置:

  

  .primaryColor(primary)==>滑动时状态栏的渐变介绍的颜色

  .secondaryColor(secondary)==>滑动时状态栏的渐变开始的颜色

  .scrimColor(Color.BLACK)==>滑动时Activity之间的颜色

  .position(SlidrPosition.LEFT)==>从左边滑动

  .scrimStartAlpha(0.8f)==>滑动开始时两个Activity之间的透明度

  .scrimEndAlpha(0f)==>滑动结束时两个Activity之间的透明度

  .velocityThreshold(5f)==>超过这个滑动速度,忽略位移限定值就切换Activity

  .distanceThreshold(.35f)==>滑动位移占屏幕的百分比,超过这个间距就切换Activity

5.SettingUtil

5.1.源代码如下

public class SettingUtil {
private SharedPreferences setting= PreferenceManager.getDefaultSharedPreferences(InitApp.AppContext); private static final class SettingUtilInstance{
private static final SettingUtil instance=new SettingUtil();
} public static SettingUtil getInstance(){
return SettingUtilInstance.instance;
} /**
* 获取是否开启无图模式
* @return
*/
public boolean getIsNoPhotoMode(){
return setting.getBoolean("switch_noPhotoMode",false)&& NetWorkUtil.isMobileConnected(InitApp.AppContext);
} /**
* 获取主题颜色
* @return
*/
public int getColor(){
int defaultColor=InitApp.AppContext.getResources().getColor(R.color.colorPrimary);
int color=setting.getInt("color",defaultColor);
if((color!=0)&& Color.alpha(color)!=255){
return defaultColor;
}
return color;
} /**
* 设置主题颜色
* @param color
*/
public void setColor(int color){
setting.edit().putInt("color",color).apply();
} /**
* 获取是否开启夜间模式
* @return
*/
public boolean getIsNightMode(){
return setting.getBoolean("switch_nightMode",false);
} /**
* 设置夜间模式
* @param flag
*/
public void setIsNightMode(boolean flag){
setting.edit().putBoolean("switch_nightMode",flag).apply();
} /**
* 获取是否开启自动切换夜间模式
* @return
*/
public boolean getIsAutoNightMode(){
return setting.getBoolean("auto_nightMode",false);
} /**
* 设置开启自动切换夜间模式
* @param flag
*/
public void setIsAutoNightMode(boolean flag){
setting.edit().putBoolean("auto_nightMode",flag).apply();
} public String getNightStartHour(){
return setting.getString("night_startHour","22");
} public void setNightStartHour(String nightStartHour){
setting.edit().putString("night_startHour",nightStartHour).apply();
} public String getNightStartMinute(){
return setting.getString("night_startMinute","00");
} public void setNightStartMinute(String nightStartMinute){
setting.edit().putString("night_startMinute",nightStartMinute).apply();
} public String getDayStartHour(){
return setting.getString("day_startHour","06");
} public void setDayStartHour(String day_startHour){
setting.edit().putString("day_startHour",day_startHour).apply();
} public String getDayStartMinute(){
return setting.getString("day_startMinute","00");
} public void setDayStartMinute(String day_startMinute){
setting.edit().putString("day_startMinute",day_startMinute).apply();
} /**
* 获取是否开启导航栏上色
* @return
*/
public boolean getNavBar(){
return setting.getBoolean("nav_bar",false);
} /**
* 获取是否开启视频强制横屏
* @return
*/
public boolean getIsVideoForceLandscape(){
return setting.getBoolean("video_force_landscape",false);
} /**
* 获取图标值
* @return
*/
public int getCustomIconValue(){
String s=setting.getString("custom_icon","0");
return Integer.parseInt(s);
} /**
* 获取滑动返回值
* @return
*/
public int getSlidable(){
String s=setting.getString("slidable","1");
return Integer.parseInt(s);
} /**
* 获取是否开启视频自动播放
* @return
*/
public boolean getIsVideoAutoPlay(){
return setting.getBoolean("video_auto_play",false)&&NetWorkUtil.isWifiConnected(InitApp.AppContext);
} /**
* 获取字体大小
* @return
*/
public int getTextSize(){
return setting.getInt("textsize",16);
} /**
* 设置字体大小
* @param textSize
*/
public void setTextSize(int textSize){
setting.edit().putInt("textsize",textSize).apply();
} public boolean getIsFirstTime(){
return setting.getBoolean("first_time",true);
} public void setIsFirstTime(boolean flag){
setting.edit().putBoolean("first_time",flag).apply();
}
}

5.2.这个类的作用

  利用SharePreferences来记住一些需要记住的用户设置数据。

  比如是否开启无图模式

  设置和获取主题颜色

  设置夜间模式

  设置开启视频强制横屏模式

  设置字体大小

  判断是否是第一次

6.NetWorkUtil

6.1.源代码

public class NetWorkUtil {

    public static boolean isNetWorkConnected(Context context){
if(context!=null){
ConnectivityManager manager=(ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo=manager.getActiveNetworkInfo();
return null != networkInfo&&networkInfo.isAvailable();
}
return false;
} public static boolean isWifiConnected(Context context){
if(context!=null){
ConnectivityManager manager=(ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netWorkInfo=manager.getActiveNetworkInfo();
if(null!=netWorkInfo&&netWorkInfo.getType()==ConnectivityManager.TYPE_WIFI){
return netWorkInfo.isAvailable();
}
}
return false;
} public static boolean isMobileConnected(Context context){
if(context!=null){
ConnectivityManager manager=(ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo=manager.getActiveNetworkInfo();
if(null!=networkInfo&&networkInfo.getType()==ConnectivityManager.TYPE_MOBILE){
return networkInfo.isAvailable();
}
}
return false;
} }

6.2.判断网络

  判断是否有网络,是否连接了WIFI,移动网络是否开启。  

TouTiao开源项目 分析笔记1的更多相关文章

  1. TouTiao开源项目 分析笔记2

    1.Constant常量定义类 1.1.源代码 public class Constant { public static final String USER_AGENT_MOBILE = " ...

  2. TouTiao开源项目 分析笔记6

    1.NewsChannelBean简单类笔记 1.1.Comparable接口的实现和使用 参考文章:Comparable接口的实现和使用. 因为NewsChannelBean实现了Comparabl ...

  3. TouTiao开源项目 分析笔记4==>一个简单APP 整体常用框架

    1.效果预览 1.1.如下图所以,到目前为止所有的功能. 2.从InitApp开始->SplashActivity->MainActivity 2.1.InitApp源代码.这是整个项目的 ...

  4. TouTiao开源项目 分析笔记15 新闻详情之两种类型的实现

    1.预览效果 1.1.首先看一下需要实现的效果. 第一种,文字类型新闻. 第二种,图片类型新闻. 1.2.在NewsArticleTextViewBinder中设置了点击事件 RxView.click ...

  5. TouTiao开源项目 分析笔记12 从总体到局部 构建视频主页面

    1.构建视频主列表的整体碎片VideoTabLayout 1.1.首先创建一个VideoTabLayout package com.jasonjan.headnews.module.video; im ...

  6. TouTiao开源项目 分析笔记10 实现通用普通文章片段页面

    1.RxJava的Observable数据操作符总结 1.1.Map操作符 Map操作符对原始Observable发射的没一项数据应用一个你选择的函数, 然后返回一个发射这些结果的Observable ...

  7. TouTiao开源项目 分析笔记18 视频详情页面

    1.效果预览 1.1.需要做到的真实效果 1.2.触发的点击事件 在MediaArticleVideoViewBinder的每一个item点击事件中: VideoContentActivity.lau ...

  8. TouTiao开源项目 分析笔记17 新闻媒体专栏

    1.效果预览 1.1.要实现的效果 1.2.如何调转到新闻媒体专栏 点击右上角的用户图标. 在新闻详情页面的Fragment的菜单点击事件中触发. case R.id.action_open_medi ...

  9. TouTiao开源项目 分析笔记16 新闻评论

    1.要达到的效果 1.1.主要效果图 点击了标题栏的消息图标后,然后会跳转到评论详情的页面. 1.2.触发的点击事件 在新闻详情的片段中的菜单点击事件中 设置上方标题栏的消息标的监听事件 case R ...

随机推荐

  1. Android内存监测工具使用

    用 Heap监测应用进程使用内存情况的步骤如下:1. 启动eclipse后,切换到DDMS透视图,并确认Devices视图.Heap视图都是打开的:2. 将手机通过USB链接至电脑,链接时需要确认手机 ...

  2. u-boot分析(二)----工作流程分析

    u-boot分析(二) 由于这两天家里有点事,所以耽误了点时间,没有按时更新,今天我首先要跟大家说说我对于u-boot分析的整体的思路,然后呢我以后的博客会按照这个内容更新,希望大家关注. 言归正传, ...

  3. python3线程介绍01(如何启动和调用线程)

    #!/usr/bin/env python# -*- coding:utf-8 -*- import osimport time,randomimport threading # 1-进程说明# 进程 ...

  4. E. New Reform_贪心,深搜,广搜。

    E. New Reform time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  5. 2018.7.23 oracle中的CLOB数据类型

    Oarcle中的LOB类型 1.在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这 ...

  6. TypeScript学习-TypeScript环境配置

    http://blog.csdn.net/shi_weihappy/article/details/49332091

  7. idea中不重启服务器更改代码(使用jrebel)

    http://139.199.89.239:1008/88414687-3b91-4286-89ba-2dc813b107ce 第一步 第二步:下载jrebel 第三步(这里有些有有些没有) 下载完后 ...

  8. 旧文备份:怎样利用好单片机上的存储器资源来实现OD的存储与访问

    我们知道OD(对象字典)是CANopen的核心,所有功能都是围绕它开展的,是协议栈的数据中心,良好的OD实现是协议栈高效稳定运行的基础,而OD的实现最基本的一点就是怎么去保存它.因为OD的内容比较杂, ...

  9. java Web 常见错误集锦 及解决方法

    只能删除pid为整数的商品,32位的pid商品不能删除? 原因onclick="agree('${s.pid}')"  括号中需要加 ' ' 删除多余的工作空间? 使用prefer ...

  10. HJ浇花

    题目描述 HJ养了很多花(99999999999999999999999999999999999盆),并且喜欢把它们排成一排,编号0~999999999999999999999999999999999 ...