Android系统构架
- Linux内核层:各种底层驱动
- 系统运行库层:包含C/C++库和Android运行时库
- 应用框架层:构建应用需要的API
- 应用层:各种应用
Android 四大组件
- Activity:一种包含用户界面的组件,主要用于和用户进行交互
- Service:实现程序后台运行的解决方案
- Content Provider:跨程序共享数据的标准方式
- Broadcast:组件之间以开放形式传播数据(Intent)的一种机制
跳转页面
Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
StartActivity(intent);
隐式Intent用法
Intent intent=new Intent(Intent.ACTION_VIEW)
intent.setData(Uri.parse("http://www.baidu.com"))
StartActivity(intent)
Intent intent=new Intent(Intent.ACTION_DIAL)
intent.setData(Uri.parse("tel:10086"))
startActivity(intent)
向下一个活动传递数据
String data="Hello SecondActivity";
Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("extra_data",data);
startActivity(intent);
Intent intent=getIntent();
String data=intent.getStringExtra("extra_data");
返回数据给上一个活动
Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
startActivityForResult(intent,1);
Intent intent=new Intent();
intent.putExtra("data_return","Hello FirstActivity");
setResult(RESULT_OK,intent);
- 重写FirstActivity的onActivityResult()方法:
@Override
Protected void onActivityResult(inte requestCode,int resultCode,Intent data){
Switch (requestCode){
Case 1:
if(resultCode==RESULT_OK){
String returnedData=data.getStringExtra("data_return");
}
break;
Default:
}
}
活动的生命周期
- onCreate() 第一次创建调用
- onStart() 活动由不可见到可见时调用
- onResume() 活动出返回栈时调用
- onPause() 活动被覆盖时调用
- onStop() 活动完全不可见时调用
- onDestroy() 活动被销毁时调用
- onRestart() 活动由停止状态变为运行状态调用
活动的启动模式
- standard 不管返回栈中是否存在,每次启动都会新建一个该活动实例
- singleTop 当活动处于返回栈的栈顶时,启动该活动不会新建一个实例
- singleTask 当活动处于返回栈内时,启动该活动不会新建一个实例
- singleInstance 活动会放入另外一个返回栈内。
四种基本布局
- LinearLayout 线性布局,布局内的控件可按垂直或水平线性排列
- RelativeLayout 相对布局,可相对于父布局、控件进行定位
- FrameLayout 框架布局,所有控件重叠于布局的左上角
- TableLayout 表格布局,使用表格的形式来排列控件
创建自定义控件
- (以线性自定义布局为例)编写一个LinearLayout的自定义布局,新建一个继承自LinearLayout的类重写构造函数,在构造函数中使用LayoutInflater来实现动态加载自定义布局,然后注册点击事件、编写逻辑等,最后在活动布局内指定控件的完整类名来添加自定义控件。
单位和尺寸
- 编写Android程序尽量使用match_parent和wrap_content还有权重(layout_weight)若一定要指定固定值,则使用dp来作为单位,指定文字大小使用sp作为单位。
- Android规定,屏幕密度160dpi时1dp等于1px,320dpi时1dp=2px,480dpi时1dp=3px。因此使用dp来指定控件宽和高就能保证控件在不同密度的屏幕中显示比例保持一致,sp原理相同。
保存活动中的临时数据
- 在返回栈内的活动由于内存不足被杀掉或者横竖屏切换过后该活动中的临时数据会丢失。
- 可以通过重写onSaveInstanceState()方法来保存临时数据,然后在onCreate(Bundle savedInstanceState)的Bundle参数中获取保存的临时数据。
Fragment生命周期
- onAttach->onCreate->onCreateView->onActivityCreated->onStart->onResume->onPause->onStop->onDestroyView->onDestroy->onDetach
广播的两种类型
- 标准广播(Normal broadcasts)异步执行的广播,一经发出所有广播接收器都能接收到这条广播,无接收顺序不能被截断。
发送方法:sendBroadcast(intent)
- 有序广播(Ordered broadcasts)同步执行的广播,一经发出一次只有一个广播接收器能接收到这条广播,优先级高的广播接收器可以先收到并且可以截断广播,截断后后面的广播接收器就不能接受广播了。
发送方法:sendOrderedBroadcast(intent,permissionString)
截断方法:abortBroadcast()
注册广播的两个方法
- 动态注册:在代码中注册,程序启动后才能开始接收广播。
首先定义一个继承自BroadcastReceiver的内部类,重写父类的onReceive()方法。在onCreate()方法内创建IntentFilter实例用来添加广播action,然后调用registerReceiver(BroadcastReceiver内部类实例,IntentFilter实例)。最后在onDestroy()中调用unregisterReceiver()方法来取消注册。
- 静态注册:在AndroidManifest.xml文件中注册,程序未启动就能接收广播如开机启动程序。
在标签中使用标签来静态注册广播接收器,通过android:name来指定具体注册哪一个广播接收器,然后再标签里加入想要接收的广播。之后创建一个继承自BroadcastReceiver的类,在onReceiver()方法里执行接收广播后需要执行的逻辑。
数据持久化
- 将内存中瞬时状态的数据保存到持久状态的存储设备中,Android系统中主要提供三种方式:文件存储、SharedPreference存储和SQLite存储。
内容提供器
- 使用内容提供器访问其他应用程序数据:获取到该应用程序的内容URI,然后借助ContentResolver进行CRUD操作。
- 使用内容提供器实现跨程序共享数据功能:在需要共享数据的应用内,新建一个继承自ContentProvider的类来创建自己的内容提供器,重写ContentProvider类中的六个方法(CRUD、onCreate、getType)。
Android多线程
- 多个线程被并发的执行可提高程序的效率,将耗时操作放在子线程里进行,比如发起一条网络请求时,服务器未必会立刻响应请求,若不放在子线程内,可能会导致主线程阻塞从而影响用户体验。
子线程中更新UI的方法
- 第一种:Handler+Message
在主线程中实例化一个Handler对象重写handleMessage()方法,处理Message对象,若发现Message的what字段匹配则进行ui操作。
在子线程中实例化Message对象,并指定what字段,然后调用Handler的sendMessage()方法。
- 第二种:
new Handler(context.getMainLooper()).post(
new Runnable(){
public void run(){
}
});
((Activity)context).runOnUiThread(
new Runnable(){
public void run(){
}
});
服务Service
Intent startIntent=new Intent(this,MyService.class);
startService(startIntent);
Intent stopIntent=new Intent(this,MyService.class);
stopService(stopIntent);
- 服务自停方式:
在服务内调用stopSelf()方法。
- 活动绑定服务方式:
Intent bindIntent=new Intent(this,MyService.class);
bindService(bindIntent,ServiceConnection对象,BIND_AUTO_CREATE);
unbindService(ServiceConnection对象);
服务的生命周期
- 调用startService()方法后,onCreate()方法在服务第一次创建调用,onStartCommand()方法每次启动服务都会调用。
- 调用bindService()方法后,若服务第一次创建,则onCreate()方法先于onBind()方法执行。
- 当既调用了startService()方法又调用了bindService()方法后需要同时调用stopService()和unbindService()方法才会执行onDestroy()方法。