Android学习笔记
来源:互联网 发布:黑道圣徒4数据碎片秘籍 编辑:程序博客网 时间:2024/04/30 00:33
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); }
0 0
- Android学习笔记--Gson笔记
- Android学习笔记
- Android学习笔记(二)
- android学习笔记--序
- android学习笔记1
- android学习笔记2
- android学习零碎笔记
- Android 学习笔记
- Android学习笔记(一)
- Android ExpandableListActivity 学习笔记
- Android EditText 学习笔记
- Android学习笔记3
- Android学习笔记4
- Android学习笔记5
- Android学习笔记9
- Android Animation学习笔记
- Android 学习笔记
- Android 数字签名学习笔记
- 杂记
- 两个byte[]数组合并
- [IOS/翻译]GCD-1 Grand Central Dispatch
- Android Studio快捷键
- 解决socket服务器(chatserver)的问题
- Android学习笔记
- NoClassDefFoundError出现的一个原因
- c++对象内存模型【内存布局】
- 剖析Maven总括
- javaoop--io操作
- apply plugin: 'java'原理
- 对齐次坐标的理解
- 单元测试的基本准则
- poi2012 切题记