1. Android应用程序组成
2 Activity
• 每一个有用户界面的应用至少包含一个activity
• 一个应用可以有多个activity,其中一个作为main activity用于启动显示
• Activity通过startActivity或startActivityForResult启动另外的activity
• 通过View管理UI
• View绘制UI与处理UI event
• View可通过xml描述定义,也可在代码中生成。
• setContentView(R.layout.main)
• Android建议将UI设计和逻辑分离
• android UI设计类似swing,通过布局(layout)
public void setContentView(int layoutResID)
public void setContentView(View view)
public void setContentView(View view, ViewGroup.LayoutParams params)
最简单的就是你可以把Activity看成一个User Interface Program,原则上它会提供使用者一个交互式的接口功能,那一个UI只有一个activity吗?非也,举例来说:一个email程序,就可能 包含三个activity:邮件列表的activity、显示邮件内容的activity、写新邮件或回复邮件的activity。
所有的Activity在系统里由Activity堆栈所管理,当一个新的Activity被执行后,它将会被放置到堆栈的最顶端,并且变 成"running activity", 而先前的Activity原则上还是会存在于堆栈中,但它此时不会是在前景的情况,除非刚刚那个新的Activity离开。
当一个Activity在屏幕的最上层时(堆栈的最顶端),它就是属于active或running的状态。
• PAUSE:如果一个Activity失去焦点(focus)但还看得到它的画面(比如:一个新的Activity画面并不是全屏幕或者它是一个半透明的情况),那失去焦点的这个Activity则处在paused的状态。像这个失去焦点的Activity它还是完全活着的,并没有消失。(活着的意思是指,Activity自已本身所有的状态及数据都还是存在的,也跟窗口管理程序window manager保持连系着),像这种paused的activity,会在一种情况下消失,那就是当系统的内存不够用之时,系统会自动判断,把不重要的 activity移除。
• STOP:如果一个Activity被其它的Activity完全的遮住时,这个被遮的Activity处于stop的状态,它仍然保有全部的状态及数据,但因为它已不再被使用者看见,所以它的画面是被隐藏起来的(画面不需要更新),当系统内存不足时,这种stop状态的activity是最先被系统考虑拿来释放内存的。
当一个Activity处于pause或stop的状态时,系统可以要求Activity结束(finish)或直接移除(kill)它。当它需要再度呈现在使用者面前时,它必需要能完整的重新启动及回复先前的状态 。
Activity状态图如下图所示:
3. Intent
• 类似于消息、事件通知,它描述将被执行的操作;
• Intent构成:mAction、mData、mType、mPackage、mComponent、mCategories;
private String mAction;
private Uri mData;
private String mType;
private String mPackage;
private ComponentName mComponent;
private int mFlags;
private HashSet<String> mCategories;
private Bundle mExtras;
private Rect mSourceBounds;
private Intent mSelector;
private ClipData mClipData;
• 是 Activity、Service、broadcast receiver之间的桥梁;
• 其使用场景如下:
// Interface to global information about an application environment.
public abstract class Context {
public abstract void startActivity(Intent intent);
public abstract void sendBroadcast(Intent intent);
public abstract ComponentName startService(Intent service);
public abstract boolean bindService(Intent service, ServiceConnection conn,int flags);
}
• 两类intent:
1) 显式:指定具体的目标组件处理
startActivity(new Intent(ActivityLifecycle.this, AnotherActivity.class));
2) 隐式:由系统接受并决定如何处理
startActivity(new Intent(Intent.ACTION_DIAL));
• 在AndroidManifest.xml中定义Activity、Service、Broadcast Receiver可接受的Intent,如下图所示:
• Intent filter: action、category、data
• 实例
4. Service
• 没有UI,启动之后一直运行于后台
• 例子:音乐播放器
• 与应用程序的其他模块(例如activity)一同运行于主线程中
• 通过startService或bindService创建Service
• 通过stopService或stopSelf终止Service
• 一般的,在activity中启动和终止service
• Service生命周期
5. Content Provider
• 什么是Content Provider?1) Content Provider 是Android应用程序的四大组成部分之一
2) 是android中的跨应用访问数据机制
• 为何需要Content Provider?
1) Android中每一个App的资源是私有的
2) App通过Content Provider和其他App共享私有数据
• 如何使用Content Provider?
通过ContentResolver访问:Context.getContentResolver()
• URI定位资源,例子如下:
content://contacts/people
content://call_log
• 类似关系数据库的访问方式(ContentResolver的方法),其方法如下:
delete(Uri url, String where, String[] selectionArgs)
insert(Uri url, ContentValues values)
query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
update(Uri uri, ContentValues values, String where,String[] selectionArgs)
5.1 Android的存储
一般的,应用程序的数据(包括文件)都是私有的,有以下四种持久存储方式:1) Preferences——类似properties,xml文件
2) Files
3) Database——SQLite
4) Network
6. Broadcast Receiver
• 接收和处理android的广播消息• Android的广播机制:
1) 系统事件——例如变换时区、电量低等
2) App发出广播消息:sendBroadcast
3) 广播消息:Intent
6.1 创建Broadcast Receiver
• 实现一个BroadcastReceiverpublic class MyAndroidReceiver extends BroadcastReceiver
{
override onReceive(Context context, Intents Intents)
{
...
}
}
• 注册BroadcastReceiver1) 在AndroidManifest.xml文件中进行注册
<receiver Android:name=“MyAndroidReceiver">
<intent-filter>
<action Android:name="com.eoeAndroid.action.NEW_BROADCAST"/>
</intent-filter>
</receiver>
2) 在代码当中直接进行注册IntentFilter filter = new IntentFilter("NEW_BROADCAST" );
MyAndroidReceiver MyAndroidReceiver = new MyAndroidReceiver();
registerReceiver(MyAndroidReceiver , filter);
6.2 Broadcast Receiver生命周期
• Broadcast receiver对象在onReceive返回后被销毁
• onReceive中不适合处理异步过程。例如弹出对话框与用户交互,可使用消息栏替代。
7. Android权限控制
• 在AndroidManifest.xml中描述一个app的权限,例如:<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.app.myapp" >
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-persission android:name="android.permission.INTENET"/>
</manifest>
• 权限举例(参考android.Manifest.permission)