Android面试题大全之Activity
1、什么是Activity?
-------------------------------------------------------------------------------------------------------
四大组件之一,一般一个用户交互界面对应一个activity
setContentView() ,// 要显示的布局
activity 是Context的子类,
同时实现了window.callback和keyevent.callback,
可以处理与窗体用户交互的事件.
button.setOnclickLinstener{
}
开发常用的的有ListActivity , PreferenceActivity ,TabAcitivty等…
如果界面有共同的特点或者功能的时候,还会自己定义一个BaseActivity
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()的方法里面.
这样保证每次用户看到的数据都是最新的
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方法
游戏开发中, 屏幕的朝向都是写死的.
5、你后台的Activity被系统 回收怎么办?如果后台的Activity由于某原因被系统回收可了,如何在被系统回收之前保存当前状态?
-------------------------------------------------------------------------------------------------------
除了在栈顶的activity,其他的activity都有可能在内存不足的时候被系统回收,一个activity越处于栈底,被回收的可能性越大.
protected void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
outState.putLong("id", 1234567890);
}
public void onCreate(Bundle savedInstanceState) {
//判断 savedInstanceState是不是空.
//如果不为空就取出来
super.onCreate(savedInstanceState);
}
6、如何退出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<Activity> lists ;
在application 全集的环境里面
lists = new ArrayList<Activity>();
每一个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中处理,递归关闭。
404 退出程序OnActivityResult();
7、两个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("10001");
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);
8、同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?
-------------------------------------------------------------------------------------------------------
比方说在激活一个新的activity时候, 给intent设置flagIntent的flag添加FLAG_ACTIVITY_NEW_TASK
singleinstance 单独的任务栈
这个被激活的activity就会在新的task栈里面…
Intent intent = new Intent(A.this,B.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
1、怎么让在启动一个Activity是就启动一个service?
-------------------------------------------------------------------------------------------------------
在activity的onCreate()方法里面 startService();
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) {
//可以通过IBinder的对象 去使用service里面的方法
}
public void onServiceDisconnected(ComponentName name) {
}
}
3、请描述一下Intent 和 Intent Filter。
-------------------------------------------------------------------------------------------------------
Android 中通过 Intent 对象来表示一条消息,一个 Intent 对象不仅包含有这个消息的目的地,还可以包含消息的内容,这好比一封 Email,其中不仅应该包含收件地址,还可以包含具体的内容。
对于一个 Intent 对象,消息“目的地”是必须的,而内容则是可选项。通过Intent 可以实现各种系统组件的调用与激活.
Intent filter: 可以理解为邮局或者是一个信笺的分拣系统…这个分拣系统通过3个参数来识别Action:
动作
Intent.ation_view
Data: 数据uri uri
mimeCategory : 而外的附加信息
Action 匹配
Action 是一个用户定义的字符串,用于描述一个 Android 应用程序组件,
一个 Intent Filter 可以包含多个 Action。
在 AndroidManifest.xml 的 Activity 定义时可以在其 <intent-filter >节点指定一个 Action 列表用于标示 Activity 所能接受的“动作”,
例如:
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<action android:name="cn.itcast.action" />
……
</intent-filter>
如果我们在启动一个 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 携带外部数据给目标组件。在 <intent-filter >节点中,通过 <data/>节点匹配外部数据。mimeType 属性指定携带外部数据的数据类型,scheme 指定协议,host、port、path 指定数据的位置、端口、和路径。
如下:
<data
android:mimeType="mimeType"
android:scheme="scheme"
android:host="host"
android:port="port"
android:path="path"/>
电话的uri tel: 12345 http://www.baidu.com
自己定义的uri itcast://cn.itcast/person/10
如果在 Intent Filter 中指定了这些属性,那么只有所有的属性都匹配成功时
URI 数据匹配才会成功。
Category 类别匹配<intent-filter >节点中可以为组件定义一个 Category 类别列表,当 Intent 中包含这个列表的所有项目时 Category 类别匹配才会成功。默认是DEFAULT
4、说说Activity,Intent,Service是什么关系 。麦当劳和麦当娜的关系是什么关系?
-------------------------------------------------------------------------------------------------------
这种问题,就讲下activity,讲一下service,说一下 通过intent去激活组件,
传递数据.
说自己项目中有这样一个网络更新的功能,显示界面就用的activity,
后台有个service每隔半小时都去访问下服务器获取更新的数据…
开启服务用的是intent来开启
1. 请描述一下Broadcast Receiver。有很多广播接收者 ,系统已经实现了.广播分两种有序广播无序广播指定接收者的广播 . 是不可以被拦截掉的
<intent-filter android:priority="1000">
<action
android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
onReceive()
方法.abortBroadcast();有序广播有一个特例
sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras);
resultReceiver 广播接受者
如果我们显示的指定了广播接收者 无论如何 都会接受广播 时间 abortBroadcast();
的方法不会终止广播时间
SetresultData();
StickysendStickyBroadcast(intent)
// 阴魂不散的广播 Wifi设置 用于接收系统的广播通知, 系统会有很多sd卡挂载,手机重启,广播通知,低电量,来短信等,一个apk的安装成功…. 手机卫士中自定义一个broadcast receiver
<intent-filter android:>
<action> sms_received </action>
</intent-filter>
来获取短信到来的广播, 根据黑名单来判断是否拦截该短信. 画画板生成图片后,发送一个sd挂载的通知,通知系统的gallery去获取到新的图片.
Intent intent = new Intent(Intent.ACTION_MEDIA_MOUNTED,Uri.parse("file://"+Environment.getExternalStorageDirectory()));
sendBroadcast(intent);
5、Service和Activity在同一个线程吗?
------------------------------------------------------------------------------------------------------- 默认情况同一线程 main主线程 ui线程
6、widget相对位置的完成在activity的哪个生命周期阶段实现。-------------------------------------------------------------------------------------------------------widget可以理解成桌面小控件,
也可以理解成 某个button, imageview这样的控件…
onmeasure() // 计算
控件在屏幕上的位子某个view 要显示在界面
ondraw
被显示到界面上的