本文是从个人学习过程中所记录的笔记中经过再次整理而得,所有观点仅代表个人理解,如有错误,还望指出。
绝大部分Activity是用于和用户交互的,Activity会创建一个交互窗口,可以通过调用setContentView(View)来放置一个布局在activity的窗口中。
通常是在PhoneWindow的DecorView中,显示UI会延迟大概300ms左右,在此之前,View还没有被填充,所以要在onCreate()中获去View的尺寸,需要创建一个线程,在线程中等待300ms以上,再获取View的尺寸。
Activity提供的窗口可以是充满屏幕的,也可以是悬浮窗口(通过windowIsFloating来设置),或者嵌入到其它的Activity中,通过ActivityGroup来实现。
当一个activity被启动时,他就会处于Activity Task的顶端。
大部分实现Activity的子类需要重写onCreate(Bundle)和onPause(),在onPause()方法中通常使用ContentProvider来保存用户信息的改变,或者使用SharedPreference来保存用户设置的改变。在这个方法中通常也清除Activity产生的资源,避免造成浪费。
当一个activity失去焦点,但是任然可见时,它就会进入暂停状态onPause(),此时它会保留所有的状态和成员信息;但此时的activity将可能会被系统关闭。
activity通常会频繁的调用onPause()和onResume()方法,所以这两个方法中执行的代码应该是较为轻量的。但任然应该把保存数据的代码写在onPause()方法当中。
当调用onPause()时,会调用onSaveInstaneState(Bundle)和onRestoreInstanceState()来暂存view的状态,并且将在调用onCreate(Bundle)时接收,但这个方法并不属于activity生命周期的一部分,所以有些时候它并不会被调用,如果复写这两个方法将能扩展它的功能,并且使activity更加健壮,以应对一些不可预见的错误。
对于需要重复加载的事务,应该写在onResume()中。onCreate()中就放一些初始化的操作,即这些操作只需要执行一次。
通过设置view的android:saveEnable属性或者调用setSaveEnable()可以决定view的状态state是否被保存。
当一个activity失去焦点,并且不可见时,它就会进入停止状态onStop(),此时它任然能保留状态和成员信息;但此时的activity更容易被系统关闭。调用onRestart()方法可以重新启动activity。
对于启动了另一个activity的情况,只有当被启动的activity执行到onResume()时,才能知道它是否会使当前的activity变得不可见,此时才能决定当前的activity是否调用onStop()。
假设有A,B两个Activity,
B完全覆盖A的情况:
当B完全呈现时,即B执行了onResume(),那么A就会执行onStop();在此之前,A是处于 onPuase()状态。
B没有完全覆盖A的情况:
当一个B完全呈现时,即B执行了onResume(),A任然出于onPuase()状态。
Activity将在调用onDestroy()时释放掉所有的资源;在这个方法中调用isFinishing()方法来判断是否activity执行完成,否则就不要执行销毁。
当系统配置改变时(比如语言、屏幕方向等),现行的activity将被调用onDestory()方法,然后自动调用onCreate()重新创建Activity;
如果不希望这些发生,可以在Manifest.xml中添加android:configChanges属性,添加这个属性之后,当配置发生改变时将直接调用onConfigrationChanged()方法,而不会调用onCreate()。
通过startActivity(Intent)启动。
通过startActivityForResult(Intent)启动;需要重写onActivityResult(int requastCode,int resultCode,Intent data)方法,并在该方法中处理返回的数据;并且在被启动activity中需要调用setResult(int resultCode,Intent intent)方法来设置结果。
通过
startActivity(intent,ActivityOptions.makeScreenTransitionAnimation(this).toBundle())
来启动,可以使被启动的Activity有动画效果。后面的文章会进一步讲解。
通过数据库Database储存。
通过SharedPreferences.note 储存。
例子:
public class CalendarActivity extends Activity {
//...
static final int DAY_VIEW_MODE =0;
static final int WEEK_VIEW_MODE =1;
private SharedPreferences mPrefs;
private int mCurViewMode;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
/**
* 该方法用于获得应用程序中的SharedPreferences对象。没有则会创建。
* @param1 :SharedPreferences的文件名。
* @param2 :打开模式。这里MODE_PRIVATE为私有模式,只能在该类中使 用。
*/
SharedPreferences mPrefs = getSharedPreferences("test",MODE_PRIVATE);
/**
* 该方法是获得SharedPreferences中对应标签的值。
*/
mCurViewMode = mPrefs.getInt("view_mode", DAY_VIEW_MODE);
}
protected void onPause(){
super.onPause();
/**
* 使用edit()方法获得SharedPreferences的SharedPreferences.Editor属性。
*/
SharedPreferences.Editor ed = mPrefs.edit();
/**
* 使用该方法以键值对方式储存数据在SharedPreferences中。
*/
ed.putInt("view_mode", mCurViewMode);
/**
* 记得调用commit()提交
*/
ed.commit();
}
}
方法 | 作用 |
---|---|
onCreateContextMenu(ContextMenu menu,View v,ContextMenu.ContextMenuInfo menuInfo) | 每次context menu被显示时都会被调用 |
registerForContextMenu(View) | 注册一个View到context view中,需要设置一个监听器监听它 |
onCreateContextMenuListener | |
unregisterForContextMenu(View) | 移除context menu中的view的监听器 |
openContextMenu(View) | 打开context menu |
onContextItmeSelected(MenuItemitem) | 通过重写这个方法可以实现对MenuItem的控制 |
onContextMenuClosed(Menu menu) | 通过重写这个方法可以实现当menu被关闭时的控制 |
closeContextMenu() | 使用代码关闭环境菜单 |
onCreateOptionsMenu(Menu menu) | 创建一个optionsMenu,这个方法只会被调用一次 |
openOptionsMenu() | 打开option menu |
onOptionsItemSelected(MenuItem) | 通过重写这个方法来控制item被选择时的活动 |
closeOptionsMenu() | 使用代码关闭选项菜单 |
onOptionsMenuClosed(Menu menu) | 通过重写这个方法来控制option menu被关闭时的活动 |
onCreatePanelMenu(int featureId,Menu menu) | 创建一个menu,并指定它的id |
onMenuOpened(int featureId,Menu menu) | 通过重写这个方法来控制menu被打开时的活动 |
onMenuItemSelected(int featureld,MenuItem item) | 处理item被选择的事件,通过feature来分辨这些item是哪一个panel中的 |
onPanelClosed(int featureId,Menu manu) | 通过重写这个方法来控制menu被关闭时的活动 |
onCreateView(View parent,String name,Context context,AttributeSet attrs) | 创建一个View对象 parent:指定这个view创建在那个View中,可以为空。 name:名称。 context:当前的context对象。 attrs:xml中指定的填充属性 |
onCreateView(String name,Context,AttributeSet attrs) | 创建一个View对象 |
onDetachedFromWindow() | 和window解除绑定关系 |
createPendingResult(int requestCode,Intent data,int flags) | 创建一个PendingIntent对象,其它activity可以通过它来发送result到本activity的onActivityResult(int,int,Intent)中 |
dispatchGenericMotionEvent(MotionEvent ev) | 处理一般的移动事件,通过重写来自定义处理。什么时候触发? |
dispatchKeyEvent(KeyEvent event) | 处理键盘事件,通过重写来自定义处理 |
onKeyDown(int keyCode,KeyEvent event) | 处理按键按下事件 |
onKeyUp(int keyCode,KeyEvet event) | 处理按键弹起事件 |
onKeyLongPressed(int keyCode,KeyEvent event) | 处理按键长按事件 |
onKeyMultiple(int keyCode,int repeatCount,KeyEvent event) | 处理按键多次点击事件 |
onLowMemory() | 处理低内存事件 |
dispatchTouchEvent(MotionEvent ev) | 处理触摸屏幕的事件,通过重写来自定义处理 |
onTouchEvent(MotionEvent event) | 处理屏幕触摸事件 |
dispatchTrackballEvent(MotionEvent ev) | 处理轨迹事件,通过重写来自定义处理。什么时候触发? |
findViewById(int id) | 返回一个View |
finish() | 调用这个方法之后自动调用onDestroy() |
getActionbar() | 获得Activity的ActionBar |
getApplication() | 获得Activity所属的Application |
getCallingActivity() | 获得启动这个Activity的Activity |
getCallingPackage() | 获得启动这个Activity的Activity的包名 |
getIntent() | 获得启动这个activity的Intent |
getComponentName() | 获得本Activity的名称 |
getLocalClassName() | 获得去掉包名的本activity类名 |
getWindow() | 获得当前activity的窗口 |
getWindowManager() | 获得窗口管理器WindowManager |
getContentScene() | 获得呈现当前窗口的内容的Scene |
getContentTransitionManafer() | 获得窗口的默认过度管理器 |
getCurrentFocus() | 获得当前窗口中被聚焦的view |
getFragmentManager() | 获得与activity相关的fragments的FragmentManager |
getLayoutInflater() | 获得布局填充器LayoutInflater |
getLoaderManager() | 获得LoaderManager,没有的检索到会创建一个 |
getMediaControler() | 获得MediaControler,这是终态的 |
getMenuInflater() | 获得当前context中的菜单填充器MenuInflater |
getPreferences(int mode) | 获得一个SharedPreferences对象,它的名称使用的是activity的类名,在它的底层调用的是getSharedPreferences(String,int) |
getReferrer() | 获得一个Uri对象, |
getTaskId() | 获得activity所在线程的id |
isChlid() | 判断activity是否套嵌在其他activity中 |
isFinish() | 判断当前activtiy是否完成 |
isVoiceInteraction() | 判断这个activity是否是Voice交互的一个部分 |
getVoiceInteraction() | 获得VoiceInteraction,如果这个activity是voiceInteraction的一个部分 |
onActionModeFinished(ActionMode mode) | 通知activity一个动作完成了 |
onActionModeStart(ActionMode mode) | 通知activity一个动作开始了 |
onAttachFragment(Fragment fragment) | 在调用了Fragment.onAttach()之后和Fragment.onCreate()之前会被自动调用requestPermissions(String[] permission,int requestCode)请求权限 |
setActionBar(Toolbar toolbar) | 设置一个toolbar代替antionbar |
setContentView(View) | |
setContentView(int layoutResID) | |
makeSceneTransitionAnimation(Activity,View sharedElement,String sharedElementName) | |
setProgress(int progress) | 设置一个进度条在title上,必须先调用requestWindowFeature(int),progress:范围为10000 |
setProgressBarVisibility(bolean visible) | 设置进度条的可见性 |
setSecondaryProgress(int secondaryProgress) | 设置第二条进度条在title上 |
setProgressBarIndeterminate(boolean indeterminate) | 设置title上的水平进度条是否应该被模糊 |
setProgressBarIndeterminateVisibility(boolean visible) | 设置indeterminate progress的可见性 |
requestWindowFeature(int featureId) | 能够扩展窗口特性 |
setResult(int resultCode,Intent data) | |
setTitle() | |
setVisible(boolean visible) | 设置activity窗口的可见性 |
startLockTask() | 开始锁定activity |
showLockTaskEscapeManage() | 在锁定acivity期间显示消息 |
stopLockTask() | 停止锁定activity |
onSearchRequested(SearchEvent searchEvent) | 当启动搜索时会调用这个方法,重写这个方法来自定义搜索 |
name:和java程序相同。
label:活动的标题。
launchMode:启动模式。
Launch Mode | 是否存在多个实例 | Comments |
---|---|---|
“standard” | Yes | 默认值。系统总是创建一个新的activity实例。因此,任务栈中会存在多个相同的activity实例。 |
“singleTop” | 看条件。 | 如果任务栈顶存在一个该activity的实例,则不会重新创建activity实例,而是将intent发送给这个实例,并跳转到这个activity。否则会创建新的activity实例。 |
“singleTask” | No | 如果任务栈中存在一个该activity实例,就不会创建新的activity实例。而是将intent发送给已存在的activity实例,并且通过移除它前面的所有Activity来将它置于栈顶。 |
“singleInstance” | No | 和singleTask相同,但是一个任务栈中只存在一个activity实例。比如a启动b(singleInstance),b启动c,当从c按返回键时,将直接跳转回a,而不是b。因为b是在一个单独的任务栈中。 |
Intent.FLAG_ACTIVITY_CLEAR_TOP
和singleTask一样。
Intent.FLAG_ACTIVITY_SINGLE_TOP
和singleTop一样。
Intent.FLAG_ACTIVITY_NEW_TASK
在一个新的task中启动activity。类似single instance,但这每一次都会创建新的实例。
Intent.FLAG_ACITVITY_NO_HISTORY
当离开该activity时,它就会被移除。
使用finishAndRemoveTask()去完成所有的activity并移除task。
在Manifest中设置
的以下属性: