Android知识点总结
来源:互联网 发布:苹果手机游戏优化器 编辑:程序博客网 时间:2024/05/21 12:39
1. Android基本架构
Android系统架构分为Application层、Framework层、Runtime&Library层以及Kernel层。
2. Activity生命周期
3. Fragment生命周期
4. Service生命周期
from: runoob
5. Android基本布局类型
1. FrameLayout
2. LinearLayout
3. AbsoluteLayout
4. RelativeLayout
5. TableLayout
6. Activity启动模式
1. standard
标准模式,创建新的Activity时,默认创建新的Activity实例并压入任务栈栈顶。
2. singleTop
栈顶复用模式,如果当前创建的Activity已经处于任务栈栈顶,则使用该栈顶实例,而不重新创建。Activity的onCreate/onStart/onResume方法不会被执行,onNewIntent方法会被回调。
3. singleTask
栈内复用模式,如果当前创建Activity在任务栈中已存在,则使用该实例,如该实例不处于栈顶,则将该实例调到栈顶并清空上面的其他实例。同样的,Activity的onCreate/onStart/onResume方法不会被执行,onNewIntent方法会被回调。
4. singleInstance
在启动的时候,会开启一个新的BackStack,这个BackStack里只有一个Activity的实例存在,并且把这个BackStack获得焦点。这是一种很极端的模式,它会导致整个设备的操作系统里,只会存在一个这个Activity示例,无论是从何处被启动的。
7. Activity的缓存方法
1. onSaveInstanceState(Bundle outState)
当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState就会被执行。如:返回Launcher,打开新Activity,锁屏,屏幕方向切换等。
onSaveInstanceState()如果被调用,这个方法会在onStop()前被触发,但系统并不保证是否在onPause()之前或者之后触发。
2. onRestoreInstanceState (Bundle outState)
onRestoreInstanceState被调用的前提是,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用。
onRestoreInstanceState在onstart之后执行。
8. View的缓存方法
1. onSaveInstanceState
@Override protected Parcelable onSaveInstanceState() { Bundle bundle = new Bundle(); Parcelable superData = super.onSaveInstanceState(); bundle.putParcelable("super_data", superData); bundle.putParcelableArrayList("save_data", mRects); return bundle; }
2. onRestoreInstanceState
@Override protected void onRestoreInstanceState(Parcelable state) { Bundle bundle = (Bundle) state; Parcelable superData = bundle.getParcelable("super_data"); mRects = bundle.getParcelableArrayList("save_data"); super.onRestoreInstanceState(superData); }
9. Service启动方式
1. startService
StartService启动Service,首次启动会创建一个Service实例,依次调用onCreate()和onStartCommand()方法,此时Service进入运行状态,如果再次调用StarService启动Service,将不会再创建新的Service对象,系统会直接复用前面创建的Service对象,调用它的onStartCommand()方法。但是这样的Service与它的调用者无必然的联系,就是说当调用者结束了自己的生命周期,但是只要不调用stopService,那么Service还是会继续运行。无论启动了多少次Service的,只需调用一次stopService即可停掉Service。
Intent intent = new Intent(this, MyService.class);//开启ServicestartService(intent);//关闭ServicestopService(intent);
2. bindService
private class MyServiceConnection implement ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder binder) { } @Override public void onServiceDisconnected(ComponentName name) { }}ServiceConnection sc = new MyServiceConnection();Intent intent = new Intent(this, MyService.class);//开启ServicebindService(intent, sc, Context.BIND_AUTO_CREATE);//关闭ServiceunbindService(sc);
10. Service停止方式
Service停止有两种,一种是通过调用stopService()方法来停止,另一种是Service自身执行stopSelf()方法停止。
例如,写了一个后台Service在应用打开时自动清理缓存,结束后不停留在后台,这时就可以在onStartCommand()方法最后写上stopSelf(),如此就可以在清理工作结束后自动关闭Service。
@Overridepublic int onStartCommand(Intent intent, int flags, int startId) { //清理缓存 clearImageCache(); //停止Service stopSelf(); return START_NOT_STICKY;}
11. Intent传输的数据类型
1. 基本数据类型
2. 基本数据类型数组
3. String/CharSequence
4. String/CharSequence数组
5. Parcelable
6. Serializable
12. BroadcastReceiver注册方法
1. 静态注册
<receiver android:name=".MyBroadcastReceiver"> <intent-filter> <!-- 自定义广播 --> <action android:name="com.demo.myaction"/> <!-- 系统广播 --> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter></receiver>
2. 动态注册
MyBroadcastReceiver receiver = new MyBroadcastReceiver();IntentFilter filter = new IntentFilter();filter.addAction("com.demo.myaction");filter.addAction("android.intent.action.BOOT_COMPLETED");//注册registerReceiver(receiver, filter);//取消注册unregisterReceiver(receiver);
13. ContentResolver
14. Animation
1. 补间动画 (TweenAnimation)
1)AlphaAnimation(透明度渐变)
fromAlpha :起始透明度
toAlpha:结束透明度
2)ScaleAnimation(缩放渐变)
fromXScale/fromYScale:沿着X轴/Y轴缩放的起始比例
toXScale/toYScale:沿着X轴/Y轴缩放的结束比例
pivotX/pivotY:缩放的中轴点X/Y坐标,即距离自身左边缘的位置,比如50%就是以图像的 中心为中轴点
3)TranslateAnimation(位移渐变)
fromXDelta/fromYDelta:动画起始位置的X/Y坐标
toXDelta/toYDelta:动画结束位置的X/Y坐标
4)RotateAnimation(旋转渐变)
fromDegrees/toDegrees:旋转的起始/结束角度
repeatCount:旋转的次数,默认值为0,代表一次,假如是其他值,比如3,则旋转4次 另外,值为-1或者infinite时,表示动画永不停止
repeatMode:设置重复模式,默认restart,但只有当repeatCount大于0或者infinite或-1时 才有效。还可以设置成reverse,表示偶数次显示动画时会做方向相反的运动!
5)AnimationSet(组合渐变)
2. 帧动画(FrameAnimation)
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@mipmap/img1" android:duration="100" /> <item android:drawable="@mipmap/img2" android:duration="100" /> ...</animation-list>
3. 属性动画(PropertyAnimation)
1. ValueAnimator
2. ObjectAnimator
14. Android数据存储
1. SQLite
2. SharedPreference
SharedPreferences preferences = getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);//存储数据SharedPreferences.Editor editor = preferences.edit();editor.putString("myKey", "myValue");editor.commit();//取出数据preferences.getString("myKey", "defaultValue");
3. File(I/O)
4. ContentProvider
15. Assets数据访问
16. raw数据访问
17. Context总结
Android中Context解析
数字1:启动Activity在这些类中是可以的,但是需要创建一个新的task。一般情况不推荐。
数字2:在这些类中去layout inflate是合法的,但是会使用系统默认的主题样式,如果你自定义了某些样式可能不会被使用。
数字3:在receiver为null时允许,在4.2或以上的版本中,用于获取黏性广播的当前值。(可以无视)
注:ContentProvider、BroadcastReceiver之所以在上述表格中,是因为在其内部方法中都有一个context用于使用。重点看Activity和Application,可以看到,和UI相关的方法基本都不建议或者不可使用Application,并且,前三个操作基本不可能在Application中出现。实际上,只要把握住一点,凡是跟UI相关的,都应该使用Activity做为Context来处理;其他的一些操作,Service,Activity,Application等实例都可以,当然了,注意Context引用的持有,防止内存泄漏。
18. IntentService
19. Bitmap的使用
InputSream is;BitmapFactory.Options options = new BitmapFactory.Options();//当这个参数为true的时候,意味着你可以在解析时候不申请内存的情况下去获取Bitmap的宽和高//这是调整Bitmap Size一个很重要的参数设置options.inJustDecodeBounds = true;//这时候decode得到的bitmap为null,只是把图片的宽高放在Options里BitmapFactory.decodeStream(is, null, options);//获取合适的inSampleSizeoptions.inSampleSize = simpleSize;//当你希望得到Bitmap实例的时候,不要忘了将这个参数设置为falseoptions.inJustDecodeBounds = false;//这时候decode得到的才是真正的bitmap实例Bitmap bitmap = BitmapFactory.decodeStream(is,null,options);
20. View
21. ViewGroup
22. AsyncTask用法
AsyncTask用于执行异步任务。
//三种泛型类型分别表示:启动任务执行的输入参数、后台任务执行的进度、后台计算结果的类型private class MyAsyncTask extends AsyncTask<Integer, Integer, String> { @Override protected void onPreExecute() { super.onPreExecute(); //任务执行前的准备操作 Log.d(TAG, "onPreExecute, start AsyncTask"); } @Override protected String doInBackground(Integer... params) { //在此方法中执行耗时操作 Log.d(TAG, "doInBackgound"); int count = params[0];//取得execute方法传递过来参数的第一个(可传递多个) while (count > 0) { Log.d(TAG, "D-" + count); //用于发送任务执行进度以更新UI publishProgress(count); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } count--; } return "D-DAY"; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); //doInBackground方法返回的结果传到此方法中 //任务结束后将接收到的结果直接将结果显示到UI组件上 Log.d(TAG, "doInBackground done. get result = " + s); tv.setText(s); } @Override protected void onProgressUpdate(Integer... values) { //此方法在publishProgress()被调用以后被执行,用于直接将进度信息更新到UI组件上 super.onProgressUpdate(values); tv.setText("D-" + values[0]); }}//AsyncTask执行方式MyAsyncTask asyncTask = new MyAsyncTask();asyncTask.execute(10);//此处可传递N个指定类型的参数
23. Touch事件分发机制
详细内容讲解
Touch事件有关的处理方法主要由三个
//分派事件public boolean dispatchTouchEvent(MotionEvent ev)//拦截事件 public boolean onInterceptTouchEvent(MotionEvent ev)//处理事件public boolean onTouchEvent(MotionEvent event)
24. Android ANR
ANR表示Application Not Responding。发生ANR主要有以下三种情形:
- 主线程对输入事件5秒内没有处理完毕
- 主线程在执行BroadcastReceiver的onReceive()函数时10秒内没有处理完毕
- 主线程在Service的各个生命周期函数时20秒内没有处理完毕。
如何避免程序发生ANR:
- UI线程尽量只做跟UI相关的工作
- 耗时的操作(比如数据库操作,I/O,连接网络或者别的有可能阻塞UI线程的操作)把它放在单独的线程处理
- 尽量用Handler来处理UIThread和别的Thread之间的交互
25. OOM
OOM表示Out Of Memory。
26. Fragment的使用
app包中的fragment和v4包中的fragment的使用的区别:
- Fragment是在3.0之后才有的,支持的版本太高,在低版本中无法使用
- android.support.v4.app.Fragment可以兼容到1.6的版本
- Fragment的FragmentManager通过getFragmentManager()得到
- v4.app.Fragment的FragmentManager通过getSupportedFragmentManager()获取
27. Fragment与Activity的交互
1. onAttach(Context context)方法
添加v4.app.Fragment需要用v4.app.FragmentActivity或v7.app.AppCompatActivity。
Activity部分实现
//实现Fragment中定义的参数传递借口public class MainActivity extends AppCompatActivity implements MainFragment.FragmentMessageListener { public static final String TAG = MainActivity.class.getSimpleName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //添加Fragment并传递数据 Bundle bundle = new Bundle(); bundle.putString("myKey", "myValue"); MainFragment mainFragment = new MainFragment(); mainFragment.setArguments(bundle); getSupportFragmentManager().beginTransaction() .add(mainFragment, "mainFragment") .commit(); } @Override public void getMsgFromFragment(String msg) { //此处接收Fragment传递过来的数据 Log.d(TAG, "Message sent from fragment received. msg = " + msg); }}
Fragment部分实现
public class MainFragment extends Fragment { public static final String TAG = MainFragment.class.getSimpleName(); //定义一个用于传输数据的接口 public interface FragmentMessageListener { void getMsgFromFragment(String msg); } private FragmentMessageListener msgListener; @Override public void onAttach(Context context) { super.onAttach(context); //绑定实现数据传输接口的Activity msgListener = (FragmentMessageListener) context; } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //获取Activity传递过来的参数 Bundle bundle = getArguments(); Log.d(TAG, "Arguments sent from Activity is = " + bundle.getString("myKey")); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.activity_main, null); } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //通过接口向Activity传递数据 msgListener.getMsgFromFragment("Fragment.onActivityCreated"); }}
2. Fragment发送广播
在Activity中注册广播接收器,从Fragment发送消息广播。
Intent intent = new Intent();intent.setAction(MainActivity.ACTION_NAME);intent.putExtra("msg", "Fragment Message");getActivity().sendBroadcast(intent);
28. SurfaceView
29. Binder
30. AIDL
31. Android运行时权限
32. Activity和AppCompatActivity的区别
33. 网络请求
34. WebView
- 【Android 总结】Android 知识点
- Android开发知识点总结
- Android开发知识点总结
- 【android】小知识点总结
- android知识点总结
- Android Service知识点总结
- android 知识点总结
- android知识点总结
- android debug,知识点总结
- android项目知识点总结
- android知识点总结
- android知识点总结
- Android零碎知识点总结
- android 知识点总结
- Android小知识点总结
- Android 实用 知识点 总结
- Android Service 知识点总结
- Android 开发知识点总结
- explicit c++
- C++技术总结
- 268. Missing Number
- 入门AQS锁
- 三、Activiti5 流程管理
- Android知识点总结
- spring 03之JDBC模版与声明式事务
- 嵌入式每日学习心得2017.07.31
- 威左夫博弈
- 微信小程序之下拉加载和上拉刷新
- 大写金额转换成阿拉伯数字金额
- dubbo再学习
- 关于Eclipse/MyEclipsejava代码模板用法
- python 不可变量和可变量(稍微深入)