1、什么是Activity?
Activity是用户和应用程序之间进行交互的接口,它提供了一个界面供用户进行各种点击、触摸、滑动等操作,
这个界面就是Activity;
2、Acitivity常见的四种状态是什么?具体表现?
第一种:活动状态(runnning), Activity处于活动状态时,用户可以进行点击、滑动等操作,屏幕会根据用户操作做出相
应,Activity此时处于栈顶状态;
第二种:暂停状态(paused),Activity处于暂停状态时,Activity暂时失去焦点,失去与用户交互的能力,成员变量和状
态信息还存在;
第三种:停止状态(stopped),Activity处于停止状态时,Activity被其他Activity完全覆盖,成员变量和状态是否被回收
取决于内存是否紧张;
第四种: 被回收状态(killed);Activity处于被回收的状态时,Activity所保存的成员变量和状态信息都会被回收。
3、Activity生命周期是怎样的?
onCreate()-->onStart()-->onResume()-->onPause()-->onStop()-->onDestory()-->onRestart() ;
创建-->开始-->运行-->暂停-->停止-->销毁-->重启
onCreate : Activity第一次创建时会调用此方法;
onStart : Activity启动时(不可见变为可见)时调用;
onResume : Activity运行时(活动准备好和用户交互/恢复一个活动)调用,运行时位于返回栈栈顶;
onPause:Activity暂停时(准备启动一个活动或恢复另一个活动)调用;
onStop : Activity状态变为完全不可见时调用;
onDestory : Activity被销毁之前调用;
onRestart : Acitivity重启时(Activity由停止状态变为运行状态时)调用;
注意:Activity生命周期的方法是成对出现的:
onCreate() & onDestory() onStart() & onStop() onResume() & onPause()
4、完整生存期、可见生存期、前台生存期有什么区别?
完整生存期:Activity在onCreate()方法与onDestory()方法之间经历的生命周期;
可见生存期:Activity在onStart()方法与onStop()方法之间经历的生命周期;
前台生存期:Activity在onResume()方法与onPause()方法之间经历的生命周期;
5、Activity启动模式
标准模式(Standard):每次启动一个Activity都会创建一个新的实例,每创建一个Activity都会走相应的生命周期;
栈顶复用模式:如果创建的Activity处于栈顶,就不会创建新的实例,会复用栈顶的Activity ;
单例模式(SingleTask):此模式会检测整个任务栈是否存在当前所需要启动的Activity,存在直接置于栈顶,并将这个Activity以上的所有Activity全部删除(销毁),但需要注意,此时会在Activity中回调一个onNewIntent()方法;
SingleInstance : 此模式下,设置次此模式的Activity在整个系统中有且只有一个实例,且这个Activity独享任务栈;
6、Android任务栈
Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动集合,这个栈也称为返回栈;
栈的原则:先进后出,系统总是会显示处于栈顶的活动给用户;
每当我们启动了一个新的活动,它都会返回栈中入栈,并处于栈顶的位置,每当我们按下返回键或者调用finish()方法销
毁一个活动时,处于栈顶扥活动会出栈,这时前一个入栈的活动就会重新处于栈顶的位置。
7、Activity的两种启动方式
显示启动:startActivity(new Intent(MainActivity.this , TargetActivity.class));
注意:Activity启动时要在Mainfest文件中进行注册
隐式启动:如果Intent没有指定要启动组件的完整类名,那么这个Intent就是隐式的,隐式的Intent只用在当我们想在自己
的App中通过Intent启动另一个App的组件时,让另一个App的组件接收并处理改Intent 。
8、startActivityForResult和启动模式
startActivityForResult方法能够起效:standard和singleTop
startActivityForResult方法不能够起效:singleTask和singleInstance
1)只要将被启动的Activity属性设置为singleTask则一定不起效
2)只要将被启动的Activity属性设置为singleInstance则一定不起效
3)只要将启动的Activity模式设置为singleInstance则不论被启动的Activity为什么模式均不起效.
9、多个Activity交互的生命周期
举例1::A activity打开 B activity的时候,生命周期变化如下:
A activity会依次执行: onCreate --> onStart --> onResume --> onPause , 然后继续执行B activity的 --> onCreate -->onStart --> onPause ,最后执行A的onStop方法(如果内存紧张A activity被回收了,那就会执行A activity的onDestory方法)
举例2:在B activity中,点击back键的时候返回到A activity时,生命周期变化如下:
首先执行的时B activity的 --> onPause --> 然后执行A activity的 onRestart --> onStart --> onResume -->最后执行B activity的---> onStop ---> onDestory .
10、使用Intent启动系统功能
1)打开一个网页:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri uri = Uri.parse("http://www.baidu.com");
intent.setData(uri);
startActivity(intent);
2)打开相册、图库
Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivity(intent);
3)发送短信
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT,"It is a messsage");
startActivity(intent);
4)打开电话页面
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri uri = Uri.parse("tel:123456");
intent.setData(uri);
startActivity(intent);
11、Activity生命周期常见状况
1) Activity正常启动: onCreate() ---> onStart() ---> onResume()
2) 点击back键回退: onPause() ---> onStop() ---> onDestory()
3) 打开新的Activity: onPause() ---> onStop() ---> onCreate() ---> onStart() --->onResume()
4) Activity异常 : onSaveInstanceState() 用来保存数据
5) Activity重新创建后进行数据恢复: onRestoreInstanceState()用来恢复数据
注意:常见情况是 在onSaveInstanceState()方法中保存数据,在onCreate()方法中进行数据的恢复
那么之后可以在 onSaveInstanceState()方法中保存数据,在onRestoreInstanceState()方法中进行数据的恢复;
既然onCreate()方法与onRestoreInstanceState()方法都可以进行数据恢复,两者的区别在于,onCreate()方法中
恢复数据需要判断bundle是否为空, 而 onRestoreInstanceState()方法则无需判断bundle是否为空.
12、Activity之间通信
1)Activity-->Activity:
通过intent进行传递,具体使用Bundle对象对传递的参数进行存取
2)Activity-->Fragment:
第一种方法:在Activity创建Bundle对象放入key,value,然后初始化目标fragment,调用setArguments方法放入bundle对
象到 Fragment中,例如onStart方法中先判断当前Fragment是否依附于Activity,如果是则通过getArguments方法根据
key获取传递的值;
第二种方法:
直接在Activity中定义方法,然后在Fragment获取对应Activity并进行强转,然后调用方法获取传递的数据
3)Fragment-->Activity:使用接口回调
在Fragment中定义一个内部回调接口,再让包含Fragment的Activity实现回调接口,然后Fragment就可以调用接口当中
的方法,将数据传递给Activity当Fragment添加到Activity中时,会调用Fragment的生命周期方法的onAttach(),在此检
查Activity是否实现了Fragment当中的接口;赋值给Fragment当中的那个接口;调用onDetach方法,这个时候要把传递
进来的activity对象释放掉
4)Activity-->Service:
第一种方式:绑定服务,即让Activity实现ServiceConnection接口,然后重写对应的两个方法;
分别为:onServiceConnected与onServiceDisconnected,前者为绑定成功时调用,后者为绑定失败时调用在Activity中
定义 目标Service.Binder 的binder对象,在onServiceConnected方法中获取目标Service中的Binder对象;然后在启动
Service的时候,使用setData传递数据
第二种方式:intent传值
在Activity中,进行startService时,使用intent.putExtra(key,value),startService(intent)传递数据;然后在Service的
onStartCommand中接收从Activity中传递过来的值,直接调用intent.getStringExtra(key);
优点是:代码简单 缺点是:只能传递一些简单的数据,性能上没有太多优势
第三种方式:使用callBack+handler
在Service类中添加一个公开的接口callBack,在接口内部定义一个onDataChange的方法,同时在Service类中的Binder方
法内,添加一个方法getMyService用于让外部Activity获取到当前Service的绑定;在Activity实现ServiceConnection接口,
在onServiceConnected中获取Service的绑定,实现回调接口;获取数据之后,使用Handler发送消息,在主线程中接收,
并更新相应的UI界面