· 什么是 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 之间跳转时必然会执行的是哪几个方法。
onCrante() //在 Activity 生命周期开始时调用onRestoreInstanceState()//用来恢复 UI 状态onReStart()//当 Activity 重新启动时调用 onStart()//Activity 对用户即将可见时调用onResume()//当 Activity 与用户交互时,绘制界面
onSaveInstanceState()//activity 即将移出栈顶保留 UI 状态时调用onPause()//暂停当前活动 activity,提交持久数据的改变,停止动画和其他占用 CPU 资源的东西,由于下一个 activity 在这个方法返回之前不会 resume,所以这个方法的代码执行要快。 onStop()//activity 不再可见时调用onDestroy()//在 Activity 销毁钱被调用的最后一个方法。
· 横竖屏切换时候 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.在 2.1 之前,可以使用 ActivityManager 的 restartPackage 方法。
它可以直接结束整个应用。在使用时需要权限 android.permission.RESTART_PACKAGES。在 2.2,这个方法失效了,可使用以下几个人工的方法
1、记录打开的 Activity:
每打开一个 Activity,就记录下来。在需要退出时,关闭每一个 Activity 即可。
2、发送特定广播:
在需要结束应用时,发送一个特定的广播,每个 Activity 收到广播后,关闭即可。
· 如果后台的 Activity 由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
被回收前调用 onSaveInstanceState()方法保存当前状态。
· 两个 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 关闭 ServiceContext.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>
<action android:name="com.example.project.SHOW_CURRENT" /> </intent-filter>
这样在调用的时候指定 Intent 的 action,系统就是自动的去对比是哪个 intent-filter 符合我们的 Activity,找到后就会启动 Activity。
一个 intent filter 是 IntentFilter 类的实例, 但是它一般不出现在代码中,而是出现在 android Manifest 文件中, 以<intent-filter>的形式. (有一个例外是 broadcast receiver 的 intent filter 是使用 Context.registerReceiver()来动态设定的, 其 intent filter 也是在代码中创建的.)
一个 filter 有 action, data, category 等字段. 一个隐式 intent 为了能被某个 intent filter 接受,必须通过 3 个测试. 一个 intent 为了被某个组件接受, 则必须通过它所有的 intent filter 中的一个.
· Intent 传递数据时,可以传递哪些类型数据?
Intent 间传送数据一般有两种常用的办法:
1.extra
2.data.
extra 可以用 Intent.putExtra 放入数据。新启动的 Activity 可用 Intent.getExtras 取出来 Bundle, 然后用 Bundles.getLong, getInt, getBoolean, getString 等函数来取放进入的值。而 data 则是传输 url。url 可以是指我们熟悉的 http, ftp 等网络地址, 也可以指 content来指向 ContentProvider 提供的资源。Intent.setData 可以放入数据,Intent.getData 可以取出数据。
· 说说 Activity,Intent,Service 是什么关系 。
一个 Activity 通常是一个单独的屏幕,每一个 Activity 都被实现为一个单独的类,这些类都是从 Activity 基类中继承来的,Activity 类会显示由视图控件组成的用户接口,并对视图控件的事件做出响应。
Intent 的调用是用来进行架构屏幕之间的切换的。Intent 是描述应用想要做什么。Intent 数
据结构中两个最重要的部分是动作和动作对应的数据,一个动作对应一个动作数据。
Android Service 是运行在后台的代码,不能与用户交互,可以运行在自己的进程,也可以运行在其他应用程序进程的上下文里。需要通过某一个 Activity 或者其他 Context 对象来调用。
Activity 跳转到 Activity,Activity 启动 Service,Service 打开 Activity 都需要 Intent 表明跳转的意图,以及传递参数,Intent 是这些组件间信号传递的承载者。
· 请描述一下 Broadcast Receiver。
Broadcast Receiver 用于接收并处理广播通知(broadcast announcements)。多数的广播是系统发起的,如地域变换、电量不足、来电来信等。程序也可以播放一个广播。程序可以有任意数量的 broadcast receivers 来响应它觉得重要的通知。broadcast receiver 可以通过多种方式通知用户:启动 activity、使用 NotificationManager、开启背景灯、振动设备、播放声音等,最典型的是在状态栏显示一个图标,这样用户就可以点它打开看通知内容。通常我们的某个应用或系统本身在某些事件(电池电量不足、来电来短信)来临时会广播一个 Intent出去,我们可以利用注册一个 Broadcast Receiver 来监听到这些 Intent 并获取 Intent 中的数据。
· 在 manifest 和代码中如何注册和使 用 broadcast receiver 。
1)在 AndroidManifest.xml 中注册
<receiver android:name="Receiver1"> <intent-filter>
<!-- 和 Intent 中的 action 对应 -->
<action android:name="com.forrest.action.mybroadcast"/> </intent-filter>
</receiver>
2)在代码中注册
1. IntentFilter filter = new IntentFilter("com.forrest.action.mybroadcast"); // 和广播中 Intent 的 action 对应
2. MyBroadcastReceiver br = new MyBroadcastReceiver();
3. registerReceiver(new MyBroadcastReceiver(), filter)
· 请介绍下 ContentProvider 是如何实现数据共享的?
ContentProvider 是通过提供 Uri 来实现数据共享
· 请介绍下 Android 的数据存储方式。
Android 提供了 5 种方式存储数据:使用 SharedPreferences 存储数据;
文件存储数据; SQLite 数据库存储数据;使用 ContentProvider 存储数据;网络存储数据;
· 为什么要用 ContentProvider?它和 sql 的实现上有什么差别?
使用 ContentProvider 可以将数据共享给其他应用,让除本应用之外的应用也可以访问本应用的数据。它的底层是用 SQLite 数据库实现的,所以其对数据做的各种操作都是以 Sql 实现,只是在上层提供的是 Uri。
· 请介绍下 Android 中常用的五种布局。
最常用的布局方式为 LinearLayout、RelativeLayout、FrameLayout、TableLayout AbsoluteLayout。其中 LinearLayout 和 RelativeLayout 是最常用的方式,他们可以通过在 xml配置文件或者代码中进行布局。