1.Constant常量定义类

1.1.源代码

public class Constant {

    public static final String USER_AGENT_MOBILE = "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Mobile Safari/537.36";

    public static final String USER_AGENT_PC = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36";

    public static final int[] TAG_COLORS = new int[]{
            Color.parseColor("#90C5F0"),
            Color.parseColor("#91CED5"),
            Color.parseColor("#F88F55"),
            Color.parseColor("#C0AFD0"),
            Color.parseColor("#E78F8F"),
            Color.parseColor("#67CCB7"),
            Color.parseColor("#F6BC7E")
    };

    public static final int[] ICONS_DRAWABLES = new int[]{
            R.mipmap.ic_launcher_circle,
            R.mipmap.ic_launcher_rect,
            R.mipmap.ic_launcher_square};

    public static final String[] ICONS_TYPE = new String[]{"circle", "rect", "square"};

    public static final int SLIDABLE_DISABLE = 0;
    public static final int SLIDABLE_EDGE = 1;
    public static final int SLIDABLE_FULL = 2;

    public static final String AS = "as";
    public static final String CP = "cp";

    public static final int NEWS_CHANNEL_ENABLE = 1;
    public static final int NEWS_CHANNEL_DISABLE = 0;
}
View Code

 

1.2.作用介绍

  标签颜色存放成一个整型数组

  logo的三个不同形状,用整型数组来存放id

  图片类型用一个字符串数组来存放

  Slidable属性值用整型存放

  AS/CP,用字符串存放

  News_Channel属性,用整型存放 


2.开源项目material-dialogs的引用

2.1.用到了这种效果

  参考文章:开源项目material-dialogs的使用。

  TouTiao开源项目 分析笔记2

 

2.2.导入引用

  compile 'com.afollestad.material-dialogs:commons:0.9.4.4'

 

2.3.具体使用

  可以参考上面那篇文章。

  TouTiao开源项目 分析笔记2

  TouTiao开源项目 分析笔记2

  TouTiao开源项目 分析笔记2

  TouTiao开源项目 分析笔记2

  TouTiao开源项目 分析笔记2

  等效果,功能强大,具体代码,点击我。

 


3.ActivityManager深入理解

3.1.这里碰到了一个类ActivityManager.TaskDescription

  然后百度了一下:

  TouTiao开源项目 分析笔记2

 

3.2.其他用法可以参考下面这篇文章。

  ActivityManager总结:http://blog.csdn.net/lanye11/article/details/52221359


4.BaseActivity分析

4.1.getWindow().setNavigationBarColor

  不知道setNavigationBarColor是什么意思

  找到了这张图。

  TouTiao开源项目 分析笔记2

 

4.2.android.R.id.home

  TouTiao开源项目 分析笔记2

  就是左上角的图标,一般就是一个左箭头。

 

4.3.按返回键,逐个出栈的方法

 @Override
    public void onBackPressed() {
        // Fragment 逐个出栈
        int count = getSupportFragmentManager().getBackStackEntryCount();
        if (count == 0) {
            super.onBackPressed();
        } else {
            getSupportFragmentManager().popBackStack();
        }
    }

 

4.4.在清单中声明启动页活动的别名 

     <activity
            android:name=".SplashActivity"
            android:configChanges="orientation|screenSize|uiMode"
            android:label="@string/app_name"
            android:theme="@style/SplashTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
            </intent-filter>
        </activity>

        <activity-alias
            android:name=".SplashActivity_circle"
            android:enabled="true"
            android:icon="@mipmap/ic_launcher_circle"
            android:label="@string/app_name"
            android:targetActivity=".SplashActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity-alias>

        <activity-alias
            android:name=".SplashActivity_rect"
            android:enabled="false"
            android:icon="@mipmap/ic_launcher_rect"
            android:label="@string/app_name"
            android:targetActivity=".SplashActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity-alias>

        <activity-alias
            android:name=".SplashActivity_square"
            android:enabled="false"
            android:icon="@mipmap/ic_launcher_square"
            android:label="@string/app_name"
            android:targetActivity=".SplashActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity-alias>

  可以看到,这里使用了<activity-alias>标签

  这里有3个标签,代表着圆形,矩形,正方形的启动页。

  所以这里每当修改了应用图标之后,这里就可以动态地变化启动图标了。

  这里有一个activity,但是写了4个<intent-filter>

  所以这招很管用。

  注意:要把第一个<intent-filter>中将<category android:name="android...LAUNCHER">删去。

  参考文章:activity-alias详解及应用。

 

4.5.android禁用和开启启动图标

  这个和上面的修改应用图标结合使用。

  当修改了应用图标,应该停止当前应用的进程。

  所以要kill掉当前应用,而且桌面图标不能生效,直到应用图标修改完成,图标也换了,然后就可以点了。

 getPackageManager().setComponentEnabledSetting(new ComponentName(BaseActivity.this, getPackageName() + act),
                            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                            PackageManager.DONT_KILL_APP);

  参考文章:android禁用和开启四大组件的方法。

 

4.6.BaseActivity源代码

public class BaseActivity extends RxAppCompatActivity {
    private static final String TAG="BaseActivity";
    protected SlidrInterface slidrInterface;
    private int iconType=-1;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        //默认图标获取的是圆形circle
        this.iconType=SettingUtil.getInstance().getCustomIconValue();
        initSlidrable();
    }

    @Override
    protected void onResume(){
        super.onResume();
        //获取主题色
        int color=SettingUtil.getInstance().getColor();
        //获取图标形状,圆,矩,正
        int drawable=Constant.ICONS_DRAWABLES[SettingUtil.getInstance().getCustomIconValue()];
        if(getSupportActionBar()!=null){
            //设置标题栏的颜色
            getSupportActionBar().setBackgroundDrawable(new ColorDrawable(color));
        }
        //如果SDK版本>=21,还要设置状态栏的颜色
        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){
            getWindow().setStatusBarColor(CircleView.shiftColorDown(color));
            //TaskDescription==>用于在最近的任务列表中设置和检索当前活动的信息
            ActivityManager.TaskDescription taskDescription=new ActivityManager.TaskDescription(
                    getString(R.string.app_name),
                    BitmapFactory.decodeResource(getResources(),drawable),
                    color
            );
            setTaskDescription(taskDescription);
            //setNavigationBar是底部导航栏,模拟器上会有
            if(SettingUtil.getInstance().getNavBar()){
                getWindow().setNavigationBarColor(CircleView.shiftColorDown(color));
            }else{
                getWindow().setNavigationBarColor(Color.BLACK);
            }
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item){
        if(item.getItemId()==android.R.id.home){
            onBackPressed();
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onBackPressed(){
        //Fragment逐个出栈
        int count=getSupportFragmentManager().getBackStackEntryCount();
        if(count==0){
            super.onBackPressed();
        }else{
            getSupportFragmentManager().popBackStack();
        }
    }

    @Override
    protected void onStop(){

        //如果iconType不为默认的圆形了
        if(iconType!=SettingUtil.getInstance().getCustomIconValue()){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    //前提是在清单中已经完成配置别名
                    String act=".SplashActivity_";
                    for(String s:Constant.ICONS_TYPE){
                        getPackageManager().setComponentEnabledSetting(new ComponentName(BaseActivity.this,getPackageName()+act+s),
                                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                                PackageManager.DONT_KILL_APP);
                    }

                    act+=Constant.ICONS_TYPE[SettingUtil.getInstance().getCustomIconValue()];

                    getPackageManager().setComponentEnabledSetting(new ComponentName(BaseActivity.this,getPackageName()+act),
                            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                            PackageManager.DONT_KILL_APP);
                }
            }).start();
        }

        super.onStop();
    }

    /**
     * 初始化Toolbar
     */
    protected void initToolbar(Toolbar toolbar, boolean homeAsUpEnabled, String title){
        toolbar.setTitle(title);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(homeAsUpEnabled);
    }

    /**
     * 初始化滑动返回
     */
    protected void initSlidrable(){
        int isSlidable=SettingUtil.getInstance().getSlidable();
        if(isSlidable!= Constant.SLIDABLE_DISABLE){
            SlidrConfig config=new SlidrConfig.Builder()
                                    .edge(isSlidable==Constant.SLIDABLE_EDGE)
                                    .build();
            slidrInterface= Slidr.attach(this,config);
        }
    }

}
View Code

相关文章: