Android 站在牛人的肩上(转载收集)
Android Activity生命周期
Activity其实是继承了ApplicationContext这个类,我们可以重写以下方法,如下代码:
- public class Activity extends ApplicationContext {
- protected void onCreate(Bundle savedInstanceState);
- protected void onStart();
- protected void onRestart();
- protected void onResume();
- protected void onPause();
- protected void onStop();
- protected void onDestroy();
- }
为了便于大家更好的理解,我简单的写了一个Demo,不明白Activity周期的朋友们,可以亲手实践一下,大家按照我的步骤来。
第一步:新建一个Android工程,我这里命名为ActivityDemo.
第二步:修改ActivityDemo.java(我这里重新写了以上的七种方法,主要用Log打印),代码如下:
- package com.tutor.activitydemo;
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Log;
- public class ActivityDemo extends Activity {
- private static final String TAG = "ActivityDemo";
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Log.e(TAG, "start onCreate~~~");
- }
- @Override
- protected void onStart() {
- super.onStart();
- Log.e(TAG, "start onStart~~~");
- }
- @Override
- protected void onRestart() {
- super.onRestart();
- Log.e(TAG, "start onRestart~~~");
- }
- @Override
- protected void onResume() {
- super.onResume();
- Log.e(TAG, "start onResume~~~");
- }
- @Override
- protected void onPause() {
- super.onPause();
- Log.e(TAG, "start onPause~~~");
- }
- @Override
- protected void onStop() {
- super.onStop();
- Log.e(TAG, "start onStop~~~");
- }
- @Override
- protected void onDestroy() {
- super.onDestroy();
- Log.e(TAG, "start onDestroy~~~");
- }
- }
第三步:运行上述工程,效果图如下(没什么特别的):
核心在Logcat视窗里,如果你还不会用Logcat你可以看一下我的这篇文章 Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e),我们打开应用时先后执行了onCreate()->onStart()->onResume三个方法,看一下LogCat视窗如下:
BACK键:
当我们按BACK键时,我们这个应用程序将结束,这时候我们将先后调用onPause()->onStop()->onDestory()三个方法,如下图所示:
HOME键:
当我们打开应用程序时,比如浏览器,我正在浏览NBA新闻,看到一半时,我突然想听歌,这时候我们会选择按HOME键,然后去打开音乐应用程序,而当我们按HOME的时候,Activity先后执行了onPause()->onStop()这两个方法,这时候应用程序并没有销毁。如下图所示:
而当我们再次启动ActivityDemo应用程序时,则先后分别执行了onRestart()->onStart()->onResume()三个方法,如下图所示:
这里我们会引出一个问题,当我们按HOME键,然后再进入ActivityDemo应用时,我们的应用的状态应该是和按HOME键之前的状态是一样的,同样为了方便理解,在这里我将ActivityDemo的代码作一些修改,就是增加一个EditText。
第四步:修改main.xml布局文件(增加了一个EditText),代码如下:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/hello"
- />
- <EditText
- android:id="@+id/editText"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- />
- </LinearLayout>
第五步:然后其他不变,运行ActivityDemo程序,在EditText里输入如"Frankie"字符串(如下图:)
这时候,大家可以按一下HOME键,然后再次启动ActivityDemo应用程序,这时候EditText里并没有我们输入的"Frankie"字样,如下图:
这显然不能称得一个合格的应用程序,所以我们需要在Activity几个方法里自己实现,如下第六步所示:
第六步修改ActivityDemo.java代码如下:
- package com.tutor.activitydemo;
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Log;
- import android.widget.EditText;
- public class ActivityDemo extends Activity {
- private static final String TAG = "ActivityDemo";
- private EditText mEditText;
- //定义一个String 类型用来存取我们EditText输入的值
- private String mString;
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mEditText = (EditText)findViewById(R.id.editText);
- Log.e(TAG, "start onCreate~~~");
- }
- @Override
- protected void onStart() {
- super.onStart();
- Log.e(TAG, "start onStart~~~");
- }
- //当按HOME键时,然后再次启动应用时,我们要恢复先前状态
- @Override
- protected void onRestart() {
- super.onRestart();
- mEditText.setText(mString);
- Log.e(TAG, "start onRestart~~~");
- }
- @Override
- protected void onResume() {
- super.onResume();
- Log.e(TAG, "start onResume~~~");
- }
- //当我们按HOME键时,我在onPause方法里,将输入的值赋给mString
- @Override
- protected void onPause() {
- super.onPause();
- mString = mEditText.getText().toString();
- Log.e(TAG, "start onPause~~~");
- }
- @Override
- protected void onStop() {
- super.onStop();
- Log.e(TAG, "start onStop~~~");
- }
- @Override
- protected void onDestroy() {
- super.onDestroy();
- Log.e(TAG, "start onDestroy~~~");
- }
- }
第七步:重新运行ActivityDemo程序,重复第五步操作,当我们按HOME键时,再次启动应用程序时,EditText里有上次输入的"Frankie"字样,如下图如示:
OK,大功基本告成,这时候大家可以在回上面看一下Activity生命周期图,我想大家应该完全了解了Activity的生命周期了,不知道你了解了没?
链接:https://www.zhihu.com/question/26417244/answer/110074475
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1、熟练掌握基本控件以及容器控件的使用 ;
常用的基本控件有:Button 、TextView、EditText、ListView等
常用的容器控件有:FrameLayout、LinearLayout、RelativeLayout等
2、熟练掌握相关监听器的注册和使用:
常用监听器有: OnClickListener、OnLongClickListener、OnItemClickListener等
3、掌握Log的使用以及分析方法 ;
4、掌握Activity、Service的生命周期和使用方法 ;
5、掌握BroadcastReceiver(广播)的接受和使用 ;
6、掌握Intent以及IntentFilter的使用 ;
7、基本掌握数据库方面知识,包括SQLiteDatabase以及ContentProvider的使用方法
除此之外,我们必须得掌握adb shell 的使用方法,常用功能有:adb pull 、 adb push 、 adb remount 指令等
由于shell类同于Linux shell ,我们还得掌握基本的Linux指令等,例如cat、cd 等 。
知识获取渠道主要为:
Android SDK以及网上大牛的博客。
附: 关于基础知识的介绍,国内的一些书籍质量真是相当差劲,味同嚼蜡。强烈不建议在此阶段买书籍,如果一定要购买的话建议郭霖老师的《第一行代码》。
网上搜索Mars老师的视频以及黑马学院的就业班视频也可以在淘宝网上购买。
实践出真知。这个阶段,你可以自己编写一些小Demo了,帮助自己在更深层次发展了。
二、 提高篇 需要掌握的技能如下:
1、掌握Canvas类的使用-- 如何绘图
2、掌握消息通信机制---Handler相关类的使用以及原理
3、掌握Context类以及实现原理
4、掌握View树的绘制流程 。 View绘制流程很重要,掌握它就基本上掌握了Android核心之一了。
4.1、掌握触摸事件的分发流程--- onInterceptTouchEvent以及onTouchEvent方法流程
4.2、掌握相关监听器的调用机制。例如OnClickListener监听时怎么调用的?
4.3、能够编写自定义View以及ViewGroup
5、理解Binder机制----Binder机制很重要,Android的进程间通信都是靠它完成的。掌握它,才能够好的完成接下来的学习。
6、基本掌握ActivityManagerService类的使用,主要掌握的知识点包括如下:
6.1、startActivity()流程,即启动一个Activity的流程 ;
6.2、startService()流程,即启动一个Service的流程 ;
7、基本掌握PackageManagerService类的使用,主要掌握的知识点包括如下:
7.1、开机时如何解析所有已安装应用程序的Apk包的信息
7.2、Intent以及IntentFilter的匹配规则以及解析过程
8、基本掌握View添加至窗口的过程---即WindowManagerIml 、WindowManagerService类的用法
知识渠道:
必备书籍: <Android内核剖析> Android源代码一份
三、 进阶篇
1、基本理解SystemServer类加载流程以及WatchDog的功能
2、more......
前面说的博客,在此推荐两个我常去的吧:
1、 应用方面,主要是魏祝林的****博客 :Android_Tutor的专栏 。 但他的博客主要是以代码为主,需要自己结合源代码揣摩 。
2、 框架方面,主要是老罗的****博客 : 老罗的Android之旅 。 但他的博客主要是以流程分析为主, 而对 流程 需要的前期准备知识介绍不足,初步看起来比较难以理解,因此,买本《Android内核剖析》是必须的,可以参考源代码仔细领悟, 强烈推荐该书籍。
由于网络上Android源码不太好找,特此共享下Android部分源码,主要包括框架层、中间层、以及一些App等,对上层开发和中间层开发还是很有用的。