Jungle_hello的博客

专注服务端开发

安卓面试题
  1. 什么是Activity?
    四大组件之一,一般的,一个用户交互界面对应一个activity
    setContentView() ,// 要显示的布局
    , activity 是Context的子类,同时实现了window.callback和keyevent.callback, 可以处理与窗体用户交互的事件.
    button.setOnclickLinstener{
    }
    我开发常用的的有ListActivity , PreferenceActivity ,TabAcitivty等…
    如果界面有共同的特点或者功能的时候,还会自己定义一个BaseActivity.
    进度对话框的显示与销毁 doubanservice

  2. 请描述一下Activity 生命周期。
    生命周期描述的是一个类 从创建(new出来)到死亡(垃圾回收)的过程中会执行的方法..
    在这个过程中 会针对不同的生命阶段会调用不同的方法
    Activity从创建到销毁有多种状态,从一种状态到另一种状态时会激发相应的回调方法,这些回调方法包括:oncreate ondestroy onstop onstart onresume onpause
    其实这些方法都是两两对应的,onCreate创建与onDestroy销毁;
    onStart可见与onStop不可见;onResume可编辑(即焦点)与onPause;
    对话框的弹出, Activity.this
    对话框是activity的一部分.
    这6个方法是相对应的,那么就只剩下一个onRestart方法了,这个方法在什么时候调用呢?
    答案就是:在Activity被onStop后,但是没有被onDestroy,在再次启动此Activity时就调用onRestart(而不再调用onCreate)方法;
    如果被onDestroy了,则是调用onCreate方法。
    最后讲自己项目中的经验,比如说豆瓣客户端每次进入某个界面的时候都要看到最新的数据,这个刷新列表的操作 就放在onStart()的方法里面.
    fillData() 这样保证每次用户看到的数据都是最新的.
    多媒体播放, 播放来电话. onStop() 视频, 视频声音设置为 , 记录视频播放的位置 mediaplayer.pause();
    onStart() 根据保存的状态恢复现场. mediaplayer.start();
    在读文档的时候 还发现 activity还有两个方法 onPostResume() 和 OnPostCreate()这两个生命周期的方法,不过开发的时候没有用到过.

  3. 两个Activity之间跳转时必然会执行的是哪几个方法。
    一般情况比如说有两个activity,分别叫A,B ,当在A里面激活B组件的时候, A 会调用 onPause()方法,然后B 调用onCreate() ,onStart(), OnResume() ,
    这个时候B覆盖了窗体, A会调用onStop()方法. 如果B呢 是个透明的,或者是对话框的样式, 就不会调用onStop()方法

  4. 横竖屏切换时候Activity的生命周期。
    这个生命周期跟清单文件里的配置有关系
    1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期
    默认首先销毁当前activity,然后重新加载
    Onpause onstop ondestory oncreate onstart onresume

2、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
游戏开发中, 屏幕的朝向都是写死的.

  1. 如何将一个Activity设置成窗口的样式。
    可以自定义一个activity的样式,详细见手机卫士的程序详细信息
    android:theme=”@style/FloatActivity”
    E:\day9\mobilesafe\res\values\style

  2. 你后台的Activity被系统 回收怎么办?如果后台的Activity由于某原因被系统回收可了,如何在被系统回收之前保存当前状态?
    除了在栈顶的activity,其他的activity都有可能在内存不足的时候被系统回收,一个activity越处于栈底,被回收的可能性越大.
    protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putLong(̶id”, 123456789);
    }
    public void onCreate(Bundle savedInstanceState) {
    //判断 savedInstanceState是不是空.
    //如果不为空就取出来
    super.onCreate(savedInstanceState);
    }

  3. 如何退出Activity?如何安全退出已调用多个Activity的Application?
    退出activity 直接调用 finish () 方法 . //用户点击back键 就是退出一个activity
    退出activity 会执行 onDestroy()方法 .

1、抛异常强制退出:
该方法通过抛异常,使程序Force Close。
验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。
//安全结束进程 android.os.Process.killProcess(android.os.Process.myPid());

2、记录打开的Activity:
每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。
List lists ; 在application 全集的环境里面
lists = new ArrayList();
每一个activity在执行oncreate()方法的时候 lists.add(this);
Ondestory() lists.remove(this);
lists.add(activity);
for(Activity activity: lists)
{
activity.finish();
}

3、发送特定广播:
在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。
//给某个activity 注册接受接受广播的意图
registerReceiver(receiver, filter)
//如果过接受到的是 关闭activity的广播 就调用finish()方法 把当前的activity finish()掉
4、递归退出
在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。
44 退出程序
OnActivityResult();
讲一讲你对activity的理解
把上面的几点用自己的心得写出来

  1. service是否在main thread中执行, service里面是否能执行耗时的操作?
    默认情况,如果没有显示的指定service所运行的进程, Service和activity是运行在当前app所在进程的main thread(UI主线程)里面
    service里面不能执行耗时的操作(网络请求,拷贝数据库,大文件 )
    在子线程中执行 new Thread(){}.start();
    特殊情况 ,可以在清单文件配置 service 执行所在的进程 ,
    让service在另外的进程中执行

  2. 两个Activity之间怎么传递数据?
    基本数据类型可以通过. Intent 传递数据
    extras.putDouble(key, value)
    intent.putExtra(name, value)
    // 通过intent putExtra 方法 基本数据类型 都传递
    Bundle bundle = new Bundle();
    bundle.putShort(key, value);
    intent.putExtras(bundle);
    intent.putExtras(bundle)

获取到激活他的 getIntent();

Intent intent = getIntent();
Bundle bundle = intent.getExtras();
Bundle 类似map的集合
intent.getStringExtra(̶key”,”value”);
intent.getBooleanExtra(̶key”,”value”)

Application 全局里面存放 对象 ,自己去实现自己的application的这个类,基础系统的application , 每个activity都可以取到
让对象实现 implements Serializable 接口把对象存放到文件上.
让类实现Serializable 接口,然后可以通过 ObjectOutputStream //对象输出流
File file = new File(̶c:\1.obj”);
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
Student stu = new Student();
stu.setId(̶11″);
stu.setName(̶zs”);
oos.writeObject(stu);
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
Student stu1 = (Student) ois.readObject();
System.out.println(stu1.getName());

Parcelable 和 Serializable
Parcelable 把对象序列化到android操作系统 的一块公用的内存空间
文件/网络
//传递数据的引用
intent.setData(Uri)
Uri.fromFile(); //大图片的传递
contentResolver.getInputStream(uri);
1. 怎么让在启动一个Activity是就启动一个service?
在activity的onCreate()方法里面 startService();

  1. 同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?
    比方说在激活一个新的activity时候, 给intent设置flag
    singleinstance 单独的任务栈
    Intent的flag添加FLAG_ACTIVITY_NEW_TASK
    这个被激活的activity就会在新的task栈里面…
    Intent intent = new Intent(A.this,B.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);

  2. Activity怎么和service绑定,怎么在activity中启动自己对应的service?
    startService() 一旦被创建 调用着无关 没法使用service里面的方法
    bindService () 把service 与调用者绑定 ,如果调用者被销毁, service会销毁
    bindService() 我们可以使用service 里面的方法
    bindService(). 让activity能够访问到 service里面的方法

构建一个intent对象,
Intent service = new Intent(this,MyService.class);

通过bindService的方法去启动一个服务,
bindService(intent, new MyConn(), BIND_AUTO_CREATE);

ServiceConnection 对象(重写onServiceConnected和OnServiceDisconnected方法) 和BIND_AUTO_CREATE.
private class myconn implements ServiceConnection
{
//异步的操作, 可能需要花费若干秒的时间
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
//可以通过IBinder的对象 去使用service里面的方法
}
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}

  1. 14 .什么是Service以及描述下它的生命周期。Service有哪些启动方法,有什么区别,怎样停用Service?
    在Service的生命周期中,被回调的方法比Activity少一些,只有onCreate, onStart, onDestroy,
    onBind和onUnbind。
    通常有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。

1 通过startService
Service会经历 onCreate 到onStart,然后处于运行状态,stopService的时候调用onDestroy方法。
如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。

2 通过bindService
Service会运行onCreate,然后是调用onBind, 这个时候调用者和Service绑定在一起。调用者退出了,Srevice就会调用onUnbind->onDestroyed方法。
所谓绑定在一起就共存亡了。调用者也可以通过调用unbindService方法来停止服务,这时候Srevice就会调用onUnbind->onDestroyed方法。

需要注意的是如果这几个方法交织在一起的话,会出现什么情况呢?
一个原则是Service的onCreate的方法只会被调用一次,就是你无论多少次的startService又bindService,Service只被创建一次。
如果先是bind了,那么start的时候就直接运行Service的onStart方法,如果先是start,那么bind的时候就直接运行onBind方法。
如果service运行期间调用了bindService,这时候再调用stopService的话,service是不会调用onDestroy方法的,service就stop不掉了,只能调用UnbindService, service就会被销毁
如果一个service通过startService 被start之后,多次调用startService 的话,service会多次调用onStart方法。多次调用stopService的话,service只会调用一次onDestroyed方法。
如果一个service通过bindService被start之后,多次调用bindService的话,service只会调用一次onBind方法。
多次调用unbindService的话会抛出异常。

  1. 不用service,B页面为音乐播放,从A跳转到B,再返回,如何使音乐继续播放?
    这个问题问的很山寨.默认不做任何处理,B里面的音乐都能播放.
    遇到问题, 可以随机应变,灵活发挥,多考虑些细节,比如说这个题就可以这样说,说说你对startActivityForResult的理解()
    A开启B的时候,用startActivityForResult()方法, B返回的时候把播放的状态信息返回给A ,A继续播放音乐.

  2. 什么是IntentService?有何优点?
    普通的service ,默认运行在ui main 主线程
    Sdk给我们提供的方便的,带有异步处理的service类,
    异步处理的方法 OnHandleIntent()
    OnHandleIntent() 处理耗时的操作

  3. 什么时候使用Service?
    拥有service的进程具有较高的优先级
    官方文档告诉我们,Android系统会尽量保持拥有service的进程运行,只要在该service已经被启动(start)或者客户端连接(bindService)到它。当内存不足时,需要保持,拥有service的进程具有较高的优先级。
    1. 如果service正在调用onCreate, onStartCommand或者onDestory方法,那么用于当前service的进程相当于前台进程以避免被killed。
    2. 如果当前service已经被启动(start),拥有它的进程则比那些用户可见的进程优先级低一些,但是比那些不可见的进程更重要,这就意味着service一般不会被killed.
    3. 如果客户端已经连接到service (bindService),那么拥有Service的进程则拥有最高的优先级,可以认为service是可见的。
    4. 如果service可以使用setForeground(true);方法来将service设置为前台状态,那么系统就认为是对用户可见的,并不会在内存不足时killed。
    如果有其他的应用组件作为Service,Activity等运行在相同的进程中,那么将会增加该进程的重要性。
    1.Service的特点可以让他在后台一直运行,可以在service里面创建线程去完成耗时的操作. 天气预报 widget TimerTask Timer 定期执行timertask
    2.Broadcast receiver捕获到一个事件之后,可以起一个service来完成一个耗时的操作.
    Broadcast receiver生命周期 和 响应时间很短
    3.远程的service如果被启动起来,可以被多次bind, 但不会重新create. 索爱手机X1i的人脸识别的service可以被图库使用,可以被摄像机,照相机等程序使用.

  4. 请描述一下Intent 和 Intent Filter。
    Android 中通过 Intent 对象来表示一条消息,一个 Intent 对象不仅包含有这个消息的目的地,还可以包含消息的内容,这好比一封 Email,其中不仅应该包含收件地址,还可以包含具体的内容。对于一个 Intent 对象,消息“目的地”是必须的,而内容则是可选项。
    通过Intent 可以实现各种系统组件的调用与激活.
    Intent filter: 可以理解为邮局或者是一个信笺的分拣系统…
    这个分拣系统通过3个参数来识别
    Action: 动作 Intent.ation_view
    Data: 数据uri uri mime
    Category : 而外的附加信息

Action 匹配
Action 是一个用户定义的字符串,用于描述一个 Android 应用程序组件,一个 Intent Filter 可以包含多个 Action。在 AndroidManifest.xml 的 Activity 定义时可以在其 节点指定一个 Action 列表用于标示 Activity 所能接受的“动作”,例如:



……

如果我们在启动一个 Activity 时使用这样的 Intent 对象:
Intent intent =new Intent();
intent.setAction(̶cn.itcast.action”);
那么所有的 Action 列表中包含了“cn.itcast”的 Activity 都将会匹配成功。
Android 预定义了一系列的 Action 分别表示特定的系统动作。这些 Action 通过常量的方式定义在 android.content. Intent中,以“ACTION_”开头。我们可以在 Android 提供的文档中找到它们的详细说明。
URI 数据匹配
一个 Intent 可以通过 URI 携带外部数据给目标组件。在 节点中,通过 节点匹配外部数据。
mimeType 属性指定携带外部数据的数据类型,scheme 指定协议,host、port、path 指定数据的位置、端口、和路径。如下:

[XML] 查看源文件 复制代码
?
1
2

阅读更多
文章标签: android 面试题
个人分类: Android面试题
想对作者说点什么? 我来说一句

android安卓面试题

2012年12月13日 196KB 下载

安卓工作面试题

2014年08月18日 1015KB 下载

安卓考试及面试题

2015年07月07日 1.04MB 下载

android面试

2016年10月06日 161KB 下载

安卓最新面试题

2015年10月23日 993KB 下载

安卓常见面试题

2017年07月24日 402KB 下载

安卓部分面试题总结

2017年05月14日 16KB 下载

android复习题题库

2015年07月01日 56KB 下载

安卓面试题.(很全)

2012年09月17日 55KB 下载

2017安卓面试题

2018年03月13日 32KB 下载

没有更多推荐了,返回首页

不良信息举报

安卓面试题

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭