1. 什么是Activity?
四大组件之一,一般的,一个用户交互界面对应一个activity
setContentView() ,// 要显示的布局
, activity 是Context的子类,同时实现了window.callback和keyevent.callback, 可以处理与窗体用户交互的事件.
button.setOnclickLinstener{
}
下面是选择性回答的东西:
我开发常用的的有ListActivity , PreferenceActivity ,TabAcitivty等…
一般的,如果有进度对话框的话,需要先讲显示的对话框销毁 后,才能关闭当前的activity,不然会窗体溢出
2. 请描述一下Activity 生命周期。
生命周期描述的是一个类 从创建(new出来)到死亡(垃圾回收)的过程中会执行的方法..
在这个过程中 会针对不同的生命阶段会调用不同的方法
Activity从创建到销毁有多种状态,从一种状态到另一种状态时会激发相应的回调方法,这些回调方法包括:
oncreate ondestroy onstop onstart onresume onpause
其实这些方法都是两两对应的,onCreate创建与onDestroy销毁;
onStart可见与onStop不可见;onResume可编辑(即焦点)与onPause;
对话框是activity的一部分. 所以弹出对话框的时候,不会执行生命周期方法
多媒体播放, 播放来电话. onStop() 视频, 视频声音设置为0 , 记录视频播放的位置 mediaplayer.pause();
onStart() 根据保存的状态恢复现场. mediaplayer.start();
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的样式,详细见手机卫士的程序详细信息
android:theme="@style/FloatActivity"
E:\day9\mobilesafe\res\values\style
6. 你后台的Activity被系统 回收怎么办?如果后台的Activity由于某原因被系统回收可了,如何在被系统回收之前保存当前状态?
除了在栈顶的activity,其他的activity都有可能在内存不足的时候被系统回收,一个activity越处于栈底,被回收的可能性越大.
<span style="font-size:14px;">protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong("id", 1234567890);
}
public void onCreate(Bundle savedInstanceState) {
//判断 savedInstanceState是不是空.
//如果不为空就取出来
super.onCreate(savedInstanceState);
}
</span>
7. 如何退出Activity?如何安全退出已调用多个Activity的Application?
退出activity 直接调用 finish () 方法 . //用户点击back键 就是退出一个activity
退出activity 会执行 onDestroy()方法 .
1、抛异常强制退出:
该方法通过抛异常,使程序Force Close。
验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。
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();
8. service是否在main thread中执行, service里面是否能执行耗时的操作?
默认情况,如果没有显示的指定service所运行的进程, Service和activity是运行在当前app所在进程的main thread(UI主线程)里面
service里面不能执行耗时的操作(网络请求,拷贝数据库,大文件 )
在子线程中执行 new Thread(){}.start();
特殊情况 ,可以在清单文件配置 service 执行所在的进程 ,
让service在另外的进程中执行
<span style="font-size:14px;"><service android:process="xxx"></service>
</span>
9. 两个Activity之间怎么传递数据?
基本数据类型可以通过. Intent 传递数据
//通过intent putExtra 方法基本数据类型都传递
Bundle bundle = new Bundle();
bundle.putShort(key, value);
intent.putExtras(bundle);
intent.putExtras(bundle)
<u><span style="font-size:14px;color:#000000;"></span></u>
Bundle 类似map的集合
intent.getStringExtra("key","value");
intent.getBooleanExtra("key","value")
Application 全局里面存放 对象 ,自己去实现自己的application的这个类,基础系统的application , 每个activity都可以取到
让对象实现 implements Serializable接口把对象存放到文件上.
Parcelable 把对象序列化到android操作系统的一块公用的内存空间
10.一般的,android在销毁一个activity的时候,都会调用onpouse,onstop,在什么情况下,会绕过这两个方法直接调用ondestroy?
假如现在你正在和某个用户界面交互,界面处于可获取焦点状态,突然,系统内存严重不足,导致系统甚至回收了当前正在显示的用户界面,在这种情况下,activity就不会去执行onpouse,onstop
11.简述一下 Intent的作用
启动一个activity
启动一个services
发送一个系统广播
12. Activity怎么和service绑定,怎么在activity中启动自己对应的service?
startService() 一旦被创建 调用着无关 没法使用service里面的方法
bindService () 把service 与调用者绑定 ,如果调用者被销毁, service会销毁
bindService() 我们可以使用service 里面的方法
bindService(). 让activity能够访问到 service里面的方法
<span style="font-size:14px;"> //构建一个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
}
}
</span>
13.Android引入广播机制的用意?
a:引入广播机制可以方便几大组件的信息和数据交互。
b:程序间互通消息(例如在自己的应用程序内监_听系统来电)
c:效率上(参考UDP的广播协议在局域网的方便性)
d:设计模式上(反转控制的一种应用,类似监_听者模式)
14 .什么是Service以及描述下它的生命周期。Service有哪些启动方法,有什么区别,怎样停用Service?
通常有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。
1 通过startService
Service会经历 onCreate 到onStart,然后处于运行状态,stopService的时候调用onDestroy方法。
如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。
2 通过bindService
Service会运行onCreate,然后是调用onBind, 这个时候调用者和Service绑定在一起。调用者退出了,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的话会抛出异常。
15. 请介绍下Android的数据存储方式。
文件
SharedPreference
数据库 sqlite
内容提供者
网络
16. 什么是IntentService?有何优点?
普通的service ,默认运行在ui main 主线程
Sdk给我们提供的方便的,带有异步处理的service类,
异步处理的方法 OnHandleIntent()
OnHandleIntent() 处理耗时的操作
17. 什么时候使用Service?
拥有service的进程具有较高的优先级
官方文档告诉我们,Android系统会尽量保持拥有service的进程运行,只要在该service已经被启动(start)或者客户端连接(bindService)到它。当内存不足时,需要保持,拥有service的进程具有较高的优先级。
18. 在manifest和代码中如何注册和使 用 broadcast receiver 。
设置广播接收者的优先级,设置广播接受者的action名字 等…
<span style="font-size:14px;"><intent-filter android:priority="1000">
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
</intent-filter>
</receiver>
<receiver android:name=".SmsReceiver">
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
<receiver android:name=".BootCompleteReceiver">
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</span>
代码中注册,如果代码没有执行,就接受不到广播事件
<span style="font-size:14px;">registerReceiver(receiver, filter);
</span>
19. 请解释下Android程序运行时权限与文件系统权限的区别。
Android程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 打电话,访问网络,获取坐标,写sd卡,读写联系人等..安装的时候会提示用户…
-rw------ 私有权限 -rw-rw-rw- 全局可读可写 linux系统的文件权限
文件系统的权限是linux权限.
20. 启动一个程序,可以主界面点击图标进入,也可以从一个程序中跳转过去,二者有什么区别?
区别是根据activity在manifest里面的配置,这个activity可能会放在不同的task栈里面
intent设置的flag flag_new_task
21. 说说mvc模式的原理,它在android中的运用。
MVC英文即Model-View-Controller,即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。
Android中界面部分也采用了当前比较流行的MVC框架,在Android中M就是应用程序中二进制的数据,V就是用户的界面。Android的界面直接采用XML文件保存的,界面开发变的很方便。在Android中C也是很简单的,一个Activity可以有多个界面,只需要将视图的ID传递到setContentView(),就指定了以哪个视图模型显示数据。
在Android SDK中的数据绑定,也都是采用了与MVC框架类似的方法来显示数据。在控制层上将数据按照视图模型的要求(也就是Android SDK中的Adapter)封装就可以直接在视图模型上显示了,从而实现了数据绑定。比如显示Cursor中所有数据的ListActivity,其视图层就是一个ListView,将数据封装为ListAdapter,并传递给ListView,数据就在ListView中显示。
22.谈谈android中常见的设计模式
单例模式:目的是为了让系统中只有一个调用对象,缺点是单例使其他程序过分依赖它,而且不同单例运行在不同进程中,使得维护困难;
工厂模式:生产固定的一些东西,如抽象类,缺点是产品修改麻烦;如喜欢动作片和爱情片的人分别向服务器发出同一个请求,就可以得到他们想看的影片集,相当于不同对象进行同一请求,需求均得到满足。
观察者模式:就是多个对象对一个对象进行监控,如缓存;
代理模式:自己的事交给别人去做,分别返回结果即可,如异步线程;
命令模式:调用对象与作用对象之间分离,由中间件来协调两者之间的工作,如控制器;
适配器模式:将一个接口变成用户所需要的接口,如baseadapter可以适配listview和spinner,因为它们有相同的接口
合成模式:将一对多的关系转换成一对整体的关系,如listview与适配器;
23,Service和Activity在同一个线程吗
默认情况同一线程 main主线程 ui线程
24. 书写出android工程的目录结构
src
android. jar
asset
res
gen
manifest
25. 请介绍下ContentProvider是如何实现数据共享的。
把自己的数据通过uri的形式共享出去
android 系统下 不同程序 数据默认是不能共享访问
需要去实现一个类去继承ContentProvider
public class PersonContentProvider extends ContentProvider{
public boolean onCreate(){
//..
}
query(Uri, String[], String, String[], String)
insert(Uri, ContentValues)
update(Uri, ContentValues, String, String[])
delete(Uri, String, String[])
}
content:// 代表contentprovider
技巧: 1.看urlmarcher.
2. 根据匹配码 查看增删改查的具体实现
26. 请介绍下Android中常用的五种布局。
FrameLayout(帧布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)
FrameLayout
从屏幕的左上角开始布局,叠加显示
LinearLayout
线性布局,这个东西,从外框上可以理解为一个div,他首先是一个一个从上往下罗列在屏幕上。每一个LinearLayout里面又可分为垂直布局
(android:orientation="vertical")和水平布局(android:orientation="horizontal"
)
AbsoluteLayout
绝对布局犹如div指定了absolute属性,用X,Y坐标来指定元素的位置android:layout_x="20px"
RelativeLayout
相对布局可以理解为某一个元素为参照物,来定位的布局方式。主要属性有:
相对于某一个元素
TableLayout <table>
表格布局类似Html里面的Table。每一个TableLayout里面有表格行TableRow,TableRow里面可以具体定义每一个元素,设定他的对齐方式 android:gravity="" 。
27. 请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。
创建消息28. 系统上安装了多种浏览器,能否指定某浏览器访问指定页面?
Intent .setAction(VIEW)
setData("http://")
Intent intent = new Intent();
// com.android.browser/.BrowserActivity
intent.setClassName("com.android.browser", "com.android.browser.BrowserActivity ");
Intent.setdata(uri);
29. ListView如何提高其效率?
复用convertview , 历史的view对象
异步加载数据, 分页加载数据, onscallLinster();
Static class ViewHolder
使用静态的view对象 避免创建过多的view.
把下载后的数据缓存到数据库里
30. 在Android中,怎么节省内存的使用,怎么主动回收内存?
尽量多使用内部类 提高程序效率
Bean private public
回收已经使用的资源,
合理的使用缓存
合理设置变量的作用范围 application 对象
System.gc();
31. dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念
Dvm的进程是dalivk虚拟机进程,每个android程序都运行在自己的进程里面,
每个android程序系统都会给他分配一个单独的liunx uid(user id),
每个dvm都是linux里面的一个进程.所以说这两个进程是一个进程.
32. sim卡的EF 文件有何作用
文件规范.
33. 嵌入式操作系统内存管理有哪几种, 各有何特性。
页式,段式,段页,等 …
34. 什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?
实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。主要用于工业控制、军事设备、航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。又可分为软实时和硬实时两种,而android是基于linux内核的,因此属于软实时。
35. 什么是ANR 如何避免它?
在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择让程序继续运行,但是,他们在使用你的应用程序时,并不希望每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样,系统不会显示ANR给用户。
Activity 5秒 broadcast10秒
耗时的操作 worker thread里面完成,
handler message…AsynsTask , intentservice.等…
36. android中的动画有哪几类,它们的特点和区别是什么?
两种,一种是Tween动画、还有一种是Frame动画。
Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;
可以通过布局文件,可以通过代码
1、控制View的动画
a) alpha(AlphaAnimation)
渐变透明
b) scale(ScaleAnimation)
渐变尺寸伸缩
c) translate(TranslateAnimation)
画面转换、位置移动
d) rotate(RotateAnimation)
画面转移,旋转动画
2、 控制一个Layout里面子View的动画效果
a) layoutAnimation(LayoutAnimationController)
b) gridAnimation(GridLayoutAnimationController)
另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。
37,java中的soft reference是个什么东西
StrongReference 是 Java 的默认引用实现, 它会尽可能长时间的存活于 JVM 内, 当没有任何对象指向它时 GC 执行后将会被回收
SoftReference 会尽可能长的保留引用直到 JVM 内存不足时才会被回收(虚拟机保证), 这一特性使得 SoftReference 非常适合缓存
这种Android的内存泄露比纯java的内存泄露还要严重,因为其他一些Android程序可能引用我们的Anroid程序的对象(比如注册机制)。即使我们的Android程序已经结束了,但是别的引用程序仍然还有对我们的Android程序的某个对象的引用,泄露的内存依然不能被垃圾回收。
二、资源对象没关闭造成的内存泄露
资源性对象比如(Cursor,File文件等)往往都用了一些缓冲,我们在不使用的时候,应该及时关闭它们,以便它们的缓冲及时回收内存。它们的缓冲不仅存在于java虚拟机内,还存在于java虚拟机外。如果我们仅仅是把它的引用设置为null,而不关闭它们,往往会造成内存泄露。因为有些资源性对象,比如SQLiteCursor(在析构函数finalize(),如果我们没有关闭它,它自己会调close()关闭),如果我们没有关闭它,系统在回收它时也会关闭它,但是这样的效率太低了。因此对于资源性对象在不使用的时候,应该调用它的close()函数,将其关闭掉,然后才置为null.在我们的程序退出时一定要确保我们的资源性对象已经关闭。
Bitmap没调用recycle()
构造Adapter时,没有使用缓存的 convertView
39. 怎么让在启动一个Activity是就启动一个service?
在activity的onCreate()方法里面 startService();
40. 同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?
比方说在激活一个新的activity时候, 给intent设置flag
Intent的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);