Android——Activity简介

本文详细介绍了Android中的Activity,包括其生命周期图、两个Activity切换时的执行情况、启动方式、数据存储方法。重点讨论了onCreate()、onPause()、onResume()和onStop()等关键方法的作用,以及如何在不同状态下保存和恢复数据。此外,还阐述了Activity的启动模式、属性和Intent的flag属性对启动模式的影响,以及如何清除Activity Task。
摘要由CSDN通过智能技术生成

本文是从个人学习过程中所记录的笔记中经过再次整理而得,所有观点仅代表个人理解,如有错误,还望指出。

  • 绝大部分Activity是用于和用户交互的,Activity会创建一个交互窗口,可以通过调用setContentView(View)来放置一个布局在activity的窗口中。
    通常是在PhoneWindow的DecorView中,显示UI会延迟大概300ms左右,在此之前,View还没有被填充,所以要在onCreate()中获去View的尺寸,需要创建一个线程,在线程中等待300ms以上,再获取View的尺寸。

  • Activity提供的窗口可以是充满屏幕的,也可以是悬浮窗口(通过windowIsFloating来设置),或者嵌入到其它的Activity中,通过ActivityGroup来实现。

Activity生命周期图

Activity生命周期图

  • 当一个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()。

两个Activity切换执行时的生命周期

假设有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()。

Activity的两种启动方式

  • 通过startActivity(Intent)启动。

  • 通过startActivityForResult(Intent)启动;需要重写onActivityResult(int requastCode,int resultCode,Intent data)方法,并在该方法中处理返回的数据;并且在被启动activity中需要调用setResult(int resultCode,Intent intent)方法来设置结果。

  • 通过
    startActivity(intent,ActivityOptions.makeScreenTransitionAnimation(this).toBundle())来启动,可以使被启动的Activity有动画效果。后面的文章会进一步讲解。

储存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)当启动搜索时会调用这个方法,重写这个方法来自定义搜索

Activity的属性

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启动模式

  • 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。

清除Activity Task

在Manifest中设置<activity>的以下属性:

  • clearTaskOnLaunch
    每次启动该acitvity时,都清除其它的activity。
  • finishOnTaskLaunch
    当再次返回该activity时,它会被finish()掉。
  • alwaysRemaindTaskState
    总是保留该activity在task中的状态,不接受任何清理命令。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值