Android学习笔记

1.获得全局Context
全局Application

public class MyApplication extends Application {
    private static Context mContext;
    private static MyApplication mApp;
    @Override
    public void onCreate() {
        super.onCreate();
        mContext = getApplicationContext();
        mApp = this;
    }

    /***
     * 获取Context对象
     * @return
     */
    public static Context getContext(){
        return mContext;
    }

    /****
     * 获取Application对象
     * @return
     */
    public static MyApplication getApp(){
        return mApp;
    }
}

Activity基类

public class BaseActivity extends AppCompatActivity {
    public Context mContext;
    public BaseActivity(){
        mContext = MyApplication.getContext();
    }
}

使用

public class MainActivity extends BaseActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void click(View view){
        switch (view.getId()){
            case R.id.btn:
                Toast.makeText(mContext, "点击了按钮", Toast.LENGTH_SHORT).show();
                break;
            case R.id.rl_parent:
                Toast.makeText(mContext, "点击了相对布局", Toast.LENGTH_SHORT).show();
                break;
        }
    }
}

2.系统启动流程

加载Linux内核—启动init进程—fork出zygote进程—fork出SystemServer进程
在zygote开启的时候,会调用ZygoteInit.main()进行初始化

  public static void main(String argv[]) {
      ......
      //为Zygote注册一个服务端Socket,用来与系统服务进行通信
       registerZygoteSocket(socketName);
    if (argv[1].equals("start-system-server")) {
                startSystemServer();
            } else if (!argv[1].equals("")) {
                throw new RuntimeException(argv[0] + USAGE_STRING);
            }
    }
    ......
 private static boolean startSystemServer()
            throws MethodAndArgsCaller, RuntimeException {
      ......
        int pid;
        try {
        ......
            /* fork SystemServer进程*/
            pid = Zygote.forkSystemServer(
                    parsedArgs.uid, parsedArgs.gid,
                    parsedArgs.gids,
                    parsedArgs.debugFlags,
                    null,
                    parsedArgs.permittedCapabilities,
                    parsedArgs.effectiveCapabilities);
        } catch (IllegalArgumentException ex) {
            throw new RuntimeException(ex);
        }
        ......
public final class SystemServer {


    /**
     *zygote的入口
     */
    public static void main(String[] args) {
        new SystemServer().run();
    }
    // 加载本地服务
        System.loadLibrary("android_servers");
         // 初始化系统上下文对象
        createSystemContext();
}
//创建SystemServiceManager,后面的其他服务都要通过他来启动
 mSystemServiceManager = new SystemServiceManager(mSystemContext);
        LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
  private void createSystemContext() {
  //创建ActivityThread对象
        ActivityThread activityThread = ActivityThread.systemMain();
        mSystemContext = activityThread.getSystemContext();
        mSystemContext.setTheme(android.R.style.Theme_DeviceDefault_Light_DarkActionBar);
    }
 public static ActivityThread systemMain() {
        if (!ActivityManager.isHighEndGfx()) {
            HardwareRenderer.disable(true);
        } else {
            HardwareRenderer.enableForegroundTrimming();
        }
        ActivityThread thread = new ActivityThread();
        thread.attach(true);
        return thread;
    }

我们看看attach方法里面

 private void attach(boolean system) {
 //创建Instrumentation
    mInstrumentation = new Instrumentation();
     //创建ContextImpl 
                ContextImpl context = ContextImpl.createAppContext(
                        this, getSystemContext().mPackageInfo);
                         //创建Application
                mInitialApplication = context.mPackageInfo.makeApplication(true, null);
                //调用Application的onCreate方法
                mInitialApplication.onCreate();
    }

接下来我们继续看SystemService里面,会通过SystemServerManager启动其他服务。

//开启核心服务
 private void startBootstrapServices() {

        Installer installer = mSystemServiceManager.startService(Installer.class);

        // 创建AMS
        mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);

        // 电源管理服务需要早点启动,因为其他服务需要依赖它
        mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
        //让Activity初始化电源管理
        mActivityManagerService.initPowerManagement();

        // 启动灯光服务
  mSystemServiceManager.startService(LightsService.class);
        //启动显示服务DMS
        mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);

        // 初始化PMS之前我们需要默认的显示
        mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);
....
        //启动PMS
        mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
                mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
        mFirstBoot = mPackageManagerService.isFirstBoot();
        mPackageManager = mSystemContext.getPackageManager();
        //启动传感器服务
        startSensorService();
    }

3.App与AMS通过Binder进行IPC通信,AMS(SystemServer进程)与zygote通过Socket进行IPC通信。在Android系统中,任何一个Activity的启动都是由AMS和应用程序进程(主要是ActivityThread)相互配合来完成的。AMS服务统一调度系统中所有进程的Activity启动,而每个Activity的启动过程则由其所属的进程具体来完成。

4.fitsSystemWindows属性的使用
这个一个boolean值的内部属性,让view可以根据系统窗口(如status bar)来调整自己的布局,如果值为true,就会调整view的paingding属性来给system windows留出空间….

实际效果:

 当status bar为透明或半透明时(4.4以上),系统会设置view的paddingTop值为一个适合的值(status bar的高度)让view的内容不被上拉到状态栏,当在不占据status bar的情况下(4.4以下)会设置paddingTop值为0(因为没有占据status bar所以不用留出空间)。

在BaseActivity里面判断

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            Window window = getWindow();
            // Translucent status bar
            window.setFlags(
                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值