开源中国APP Android端源码分析系列(一)

本文详细解析了OSChina Android客户端4.1.7版本的启动流程,从配置文件AndroidManifest.xml入手,分析了入口文件SplashActivity的类继承关系及源码,介绍了启动页设计与实现。

简述

这篇文章是基于OSCHINA
Android客户端4.1.7版本的分析,之前很多人都分析过源码,但是都是几年前的代码分析,随着时间的推移,开源中国的源码也在变化,接下来的一段时间我将分享我通过学习开源中国的代码所获得东西。

启动页面

研究一个APP或者一个网站的源码,最开始的时候一定会从APP或者网站的入口学习。OSCHINA的入口从下的配置文件可以找到AndroidManifest.xml

<application
        android:name=".OSCApplication"
        android:allowBackup="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/App.Theme.Light"
        tools:replace="android:allowBackup">
        <meta-data
            android:name="android.max_aspect"
            android:value="2.1" />

        <activity
            android:name=".improve.main.splash.SplashActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:theme="@style/App.Theme.Launch">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        ......
        ......
</application>

通过可以判断开源中国的入口文件就是SplashActivity

类的继承关系

extends
extends
SwipeBackActivity
BaseActivity
SplashActivity

SplashActivity源码

package net.oschina.app.improve.main.splash;

import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import android.view.View;
import android.widget.FrameLayout;

import com.baidu.mobstat.SendStrategyEnum;
import com.baidu.mobstat.StatService;

import net.oschina.app.OSCApplication;
import net.oschina.app.R;
import net.oschina.app.Setting;
import net.oschina.app.improve.account.AccountHelper;
import net.oschina.app.improve.app.AppOperator;
import net.oschina.app.improve.base.activities.BaseActivity;
import net.oschina.app.improve.bean.Launcher;
import net.oschina.app.improve.bean.User;
import net.oschina.app.improve.main.MainActivity;
import net.oschina.app.improve.main.introduce.IntroduceActivity;
import net.oschina.app.improve.main.tabs.DynamicTabFragment;
import net.oschina.app.improve.main.update.OSCSharedPreference;
import net.oschina.app.improve.utils.CacheManager;

import java.io.File;

import butterknife.Bind;

/**
 * 启动页设计
 * Created by huanghaibin on 2017/11/25.
 */

public class SplashActivity extends BaseActivity {


    @Bind(R.id.frameSplash)
    FrameLayout mFlameSplash;

    @Bind(R.id.fl_content)
    FrameLayout mFlameContent;

    private boolean isShowAd;

    public static void show(Context context) {
        System.out.println("SplashActivity:"+"show()方法");
        context.startActivity(new Intent(context, SplashActivity.class));
    }

    @Override
    protected int getContentView() {
        System.out.println("SplashActivity:"+"getContentView()方法");
        return R.layout.activity_splash;
    }

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


    @Override
    protected void initData() {
        super.initData();
        System.out.println("SplashActivity:"+"initData()方法");
        StatService.setSendLogStrategy(this, SendStrategyEnum.APP_START, 1, false);
        StatService.start(this);
        Launcher launcher = CacheManager.readJson(OSCApplication.getInstance(), "Launcher", Launcher.class);
        String savePath = OSCApplication.getInstance().getCacheDir() + "/launcher";
        System.out.println("SplashActivity:"+"launcher方法");
        File file = new File(savePath);
        if (launcher != null && !launcher.isExpired() && file.exists()) {
            System.out.println("SplashActivity:"+"initData()方法");
            isShowAd = true;
            mFlameSplash.setVisibility(View.GONE);
            mFlameContent.setVisibility(View.VISIBLE);
            addFragment(R.id.fl_content, AdFragment.newInstance(launcher));
        }
        AppOperator.runOnThread(new Runnable() {
            @Override
            public void run() {
                doMerge();
            }
        });
    }

    private void doMerge() {
        // 判断是否是新版本

        if (Setting.checkIsNewVersion(this)) {
            // Cookie迁移
            System.out.println("SplashActivity:"+"doMerge()方法");
            String cookie = OSCApplication.getInstance().getProperty("cookie");
            if (!TextUtils.isEmpty(cookie)) {
                OSCApplication.getInstance().removeProperty("cookie");
                User user = AccountHelper.getUser();
                user.setCookie(cookie);
                AccountHelper.updateUserCache(user);
                OSCApplication.reInit();
            }
        }

        // 栏目相关数据合并操作
        DynamicTabFragment.initTabPickerManager();

        if (isShowAd)
            return;
        // Delay...
        try {
            Thread.sleep(800);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 完成后进行跳转操作
        redirectTo();
    }

    private void redirectTo() {
        System.out.println("SplashActivity:"+"redirectTo() 方法");
        if (OSCSharedPreference.getInstance().isFirstInstall()) {
            IntroduceActivity.show(this);
        } else {
            MainActivity.show(this);
        }
        finish();
    }

    @Override
    public void onBackPressed() {
        //super.onBackPressed();
    }
}

一个activity启动最开始应该是onCreate()方法,这个类中没有onCreate方法。是因为onCreate方法在抽象类BaseActivity中,基类中写了onCreate方法,以后的无论什么类继承基类就都可以,免去了重复代码。

## 项目说明 FlyCms 是个类似知乎以问答为基础的完全开源的JAVA语言开发的社交网络建站程序,基于 Spring Boot+Bootstrap3+MyBatis+MYSQL+Solr+Ehcache 应用架构,专注于社区内容的整理、归类和检索,它集合了问答,digg,wiki 等多个程序的优点,帮助用户轻松搭建专业的知识库和在线问答社区。 业务模块包括:权限管理,会员管理,角色管理,定时任务管理(调度管理),问答管理,文章管理,分享管理,短信接口管理和邮件系统发送(注册、找回密码、邮件订阅),跨域登录,消息推送,全文检索、前国际化等等众多模块等您自己来体验! ##### 开放源码,便捷开发 基于Spring Boot版本开发,利用成熟开发技术,开放系统源码和开发文档,让二次开发更容易。 ##### 弹性设计,任性定制 UI设计简约又灵活, Bootstrap定制模板让用户自由发挥,让自己的社区更具独特个性。 ##### 管理后台,轻松掌控 管理后台功能实用简约,只需轻点功能开关,即可完成系统配置,属于你的知识社区挥而就。 ##### 轻快智能,更懂社交 FlyCms比论坛更开放,比资讯网站更了解用户,以用户为中心,更懂社交,更注重内容的分析和分享。 ##### 用戶互助,精准推送 用户之间相互解答,分享产品使用心得,只向用户推送自己关心的消息,扩大价值,压缩干扰。 > 使用说明:请保留页面底部的 *powered by 28844. com* 感谢支持 在线地址: [28844.com](http://www.28844.com) | [文档地址](https://www.28844.com/) ## 技术栈 - JDK8 - Spring-Boot - MyBatis - Freemarker - MySQL - Bootstrap3 - Solr - Quartz - i18n - Ehcache ## 特性 - 社区兼容性(IE9+) - 页面自适应布局 - 本地登录,手机注册, 邮件注册 - 登录时有验证码,尝试登录次数的限制 - 使用 `Spring-Boot` 开发 - MyBatis操作数据库 - 目前sql语句只支持MySQL,如果要切换数据库,需要手动修改代码 - Solr提供搜索和前台部分页面列表查询和分页 ## 网站功能 ##### 前台功能 - 问答栏目,用户可发布奖励积分邀请回答问题 - 答案发布管理统计等等; - 文章栏目,专家专栏,后台设置专家组可发布专业性文章资讯 - 文章栏目可分类,文章栏目目前可无限极分类 - 分享栏目,用户可分享发布如百度网盘资源地址,电影地址等等,赚取积分 - 各个栏目话题聚合内容,话题可编辑删除,审核; - 用户个人首页,可查看自己关注的用户和自己发布的内容 - 用户内容收藏 - 用户积分管理充值 - 用户绑定手机号码 - 用户绑定邮箱地址 - 用户密码找回 - 用户手机号码注册,需后台绑定运营商API; - 用户邀请注册奖励 ##### 网站后台 - 网站运营基本信息编辑 - 用户注册相关信息管理 - 用户手机运营商信息管理(目前只支持阿里大鱼) - 网站发送邮箱绑定,邮箱模板设置 - 会员信息管理、审核 - 问答管理 - 答案管理 - 文章管理、文章分类 - 话题管理 - 分享管理 - 友情链接管理 - 积分奖励规则管理 - 违禁关键词、敏感词过滤设置 - 增加定时任务管理,通过后台设置启动、关闭,执行任务日志 #### 二次开发准备 1. 开发环境要在IDE里装上lombok插件,否则编译器会报错 2. 程序部署建议使用Maven的assembly插件实现自定义打包方式 3. 项目已经接入了solr,程序安装需要先运行solr,solr已调试好,可直接启动,使用方法可访问官网查看; 4. 项目用到了阿里大于jar包,Maven时无法使用,可以下载doc/dysmsapi.zip,然后放本地的Maven的.m2\repository\com\alibaba\aliyun\目录下 5. 搜索和首页列表后期大部分前台列表准备都使用solr,所以要先下载目录下的solr,然后运行后启动程序,不然报错! #### solr原来的目录里上传的时候jar文件无法上传,压缩后提示上传文件不能大于10MB ## 如果需要的话进群空间下载,QQ群:`211378508` ## Windows下solr启动 - 比如solr放E:/盘下面,首先打开CMD窗口 - `e: `回车 - `cd e:/solr/bin` 回车 - `solr start -p 8983` 回车,等待启动成功
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值