Android的一些基本概念小整理(一)
什么是Activity?
通俗一点说Activity就是一个界面,这个界面里面可以放置各种控件。Activity的界面也是用xml文件表示的,放置在res->layout下面。每生成一个新的Activity后,我们需要在AndroidManifest.xml中注册一下这个activity
Activity生命周期
onCreate(Bundle savedInstanceState):创建activity时调用。设置在该方法中,还以Bundle的形式提供对以前储存的任何状态的访问!
onStart():activity变为在屏幕上对用户可见时调用。
onResume():activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)。
onPause():activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧!
onStop():activity被停止并转为不可见阶段及后续的生命周期事件时调用。
onRestart():重新启动activity时调用。该活动仍在栈中,而不是启动新的活动。
onDestroy():activity被完全从系统内存中移除时调用,该方法被调用
函数调用过程:
启动第一个Activity的时候:
第一次创建onCreate()-->Activity可见了onStart()-->Activity可以操作了onResume()。
两个Activity之间跳转时必然会执行的是哪几个方法
onCrante() //在Activity生命周期开始时调用
onRestoreInstanceState()//用来恢复UI状态
onReStart()//当Activity重新启动时调用
onStart()//Activity对用户即将可见时调用
onResume()//当Activity与用户交互时,绘制界面
onSaveInstanceState()//activity即将移出栈顶保留UI状态时调用
onPause()//暂停当前活动activity,提交持久数据的改变,停止动画和其他占用CPU资源的东西,由于下一个activity在这个方法返回之前不会resume,所以这个方法的代码执行要快。
onStop()//activity不再可见时调用
onDestroy()//在Activity销毁钱被调用的最后一个方法。
点击第一个Activity上的按钮通过Intent跳到第二个Activity:
第一个Activity暂停onPause()-->创建第二个ActivityonCreate()-->Activity可见onStart()-->Activity可操作onResume()-->第一个Activity被第二个Activity完全遮盖onStop()(如果调用了finish(),或者系统资源紧缺,则会被销毁onDestory())。
点击系统返回功能建,从第二个Activity回到第一个Activity :
第二个Activity暂停onPause()-->第一个Activity重启动OnRestart()(并没有被销毁,如果销毁了则要创建onCreate())-->第一个Activity可见onStart()-->第一个Activity可操作onResume()-->第二个Activity被完全遮盖onStop()(如果调用了finish(),或者系统资源紧缺,则会被销毁onDestory())。
横竖屏切换时候Activity的生命周期
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
如何将一个Activity设置成窗口的样式
1、在你的styles.xml文件中可以新建一如下的类似Dialog的style
<style name="Theme.FloatActivity"parent="android:style/Theme.Dialog"></style>
2、在AndroidManifest.xml中在你需要显示为窗口的activity中添加如下属性:android:theme="@style/Theme.FloatActivity" 即可
也可以直接添加您对应需要展示为Dialog style的Activity的android:theme属性值为android:theme="@android:style/Theme.Dialog"。
你后台的Activity被系统回收怎么办?
系统会帮我们记录下回收前Activity的状态,再次调用被回收的Activity就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数savedInstanceState。savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象,我们使用savedInstanceState可以恢复到回收前的状态。
如何退出Activity?如何安全退出已调用多个Activity的Application?
用finish()方法退出activity.
两个Activity之间怎么传递数据?
在Intent的对象中增加要传递的参数既可。在Intent的对象的请求中加入键值对,对象名字.putExtra("键值对的名字","键值对的值");在另一个Activity中将Intent请求中的数据取出来:Intent intent=getIntent();//String value = intent.getStringExtra("testIntent");//将testIntent对应的值赋值给value
怎么在启动一个Activity时就启动一个service?
将启动Service的语句放在onCreate()方法中
同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?
可以放在不同的Task中。需要为不同的activity设置不同的taskaffinity属性,启动activity的Intent需要包含FLAG_ACTIVITY_NEW_TASK标记。
Activity怎么和service绑定,怎么在activity中启动自己对应的service?
1、Activity能进行绑定得益于Service的接口。为了支持Service的绑定,实现onBind方法。
2、Service和Activity的连接可以用ServiceConnection来实现。你需要实现一个新的ServiceConnection,重写onServiceConnected和onServiceDisconnected方法,一旦连接建立,你就能得到Service实例的引用。
3、执行绑定,调用bindService方法,传入一个选择了要绑定的Service的Intent(显式或隐式)和一个你实现了的ServiceConnection实例
什么是Service以及描述下它的生命周期
Android Service是运行在后台的代码,不能与用户交互,可以运行在自己的进程,也可以运行在其他应用程序进程的上下文里。需要通过某一个Activity或者其他Context对象来调用,Context.startService() 和Context.bindService()。如果在Service执行耗时的操作需要启动一个新线程来执行。
Android Service只继承了onCreate(),onStart(),onDestroy()三个方法,当我们第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启Service时,不会在执行onCreate()方法,而是直接执行onStart()方法。
Service有哪些启动方法,有什么区别,怎样停用Service?
两种启动Service的方式Context.startService() 和Context.bindService()。
区别为:
Context.startService():Service会经历onCreate -> onStart(如果Service还没有运行,则android先调用onCreate()然后调用onStart();如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次);stopService的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService关闭Service
Context.bindService():Service会经历onCreate() -> onBind(),onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind -> onDestroyed相应退出,所谓绑定在一起就共存亡了。
停用service使用context.stopService()
不用service,B页面为音乐播放,从A跳转到B,再返回,如何使音乐继续播放?
a 使用startActivityForResult() 方法开启b,b类结束时调用finish();
a类的intent有一个子activity结束事件onActivityResult(),在事件里继续播放音乐
什么是IntentService?有何优点?
IntentService也是一个Service,是Service的子类,IntentService和Service有所不同,通过Looper和Thread来解决标准Service中处理逻辑的阻塞问题。
优点:Acitivity的进程,当处理Intent的时候,会产生一个对应的Service
Android的进程处理器现在会尽可能的不kill掉你
非常容易使用
日历中IntentService的应用
什么时候使用Service?
比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的。
请描述一下Intent 和 Intent Filter
Intent在Android中被翻译为"意图",熟语来讲就是目的,他们是三种应用程序基本组件—activity,service和broadcast receiver之间互相激活的手段。在调用Intent名称时使用ComponentName也就是类的全名时为显示调用。这种方式一般用于应用程序的内部调用,因为你不一定会知道别人写的类的全名。我们来看看隐式Intent怎么用?首先我们先配置我们的Activity的Intent Filter
<intent-filter><actionandroid:name="com.example.project.SHOW_CURRENT"/&
补充:移动开发 , Android ,