您的位置:首页 > 职场人生

Android面试题整理--1

2015-12-02 21:41 369 查看

Android知识点

1、横竖屏切换时候Activity的生命周期

①不设置activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,且竖屏时会执行两次

②设置activity的android:configChanges=”orientation”时,切屏还是会调用各个生命周期,切横屏,竖屏时只会执行一次

③设置activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

总结:

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。

2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

总结一下整个Activity的生命周期

补充一点,当前Activity产生事件弹出Toast和AlertDialog的时候Activity的生命周期不会有改变

Activity运行时按下HOME键(跟被完全覆盖是一样的):onSaveInstanceState --> onPause --> onStop       onRestart -->onStart--->onResume

Activity未被完全覆盖只是失去焦点:onPause--->onResume


2、如何将一个Activity设置成窗口的样式。

Activity属性设定做法有两种


方法1.在AndroidManifest.xml文件当中设置当前activity的一个属性(系统自带的属性):
android:theme="@android:style/Theme.Dialog"


`

方法2.

在styles.xml文件中可以新建一如下的style:

@drawable/float_box

如果窗口要添加窗口背景,可以在drawable中新建一个叫float_box.xml的文件,内容可以如下(自定义):

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#ffffff" />
<stroke android:width="3dp" color="#000000" />
<corners android:radius="3dp" />
<padding android:left="10dp" android:top="10dp"  android:right="10dp" android:bottom="10dp" />
</shape>

在AndroidManifest.xml中在你需要显示为窗口的activity中添加如果属性:android:theme="@style/Theme.FloatActivity" 即可


3、后台的Activity被系统回收怎么办?

onSaveInstanceState
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong("id", 1234567890);
}

if(savedInstanceState != null){
long id = savedInstanceState.getLong("id");
}

if(savedInstanceState != null){
long id = savedInstanceState.getLong("id");
}


被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数 savedInstanceState,没被收回的就还是onResume就好了。

savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。


4、如何退出Activity?如何安全退出已调用多个Activity的Application?

对于单一Activity的应用来说,退出很简单,直接finish()即可。也可以用killProcess()和System.exit()这样的方法。

对于多Activity的应用来说,在打开多个Activity后,如果想在最后打开的Activity直接退出。

2.1之前,可以使用ActivityManager的restartPackage方法。它可以直接结束整个应用。在使用时需要权限android.permission.RESTART_PACKAGES。

2.2添加了一个新的方法,killBackgroundProcesses(),需要权限 android.permission.KILL_BACKGROUND_PROCESSES。

系统自带的应用程序管理里,强制结束程序的方法,forceStopPackage()。

需要权限android.permission.FORCE_STOP_PACKAGES。

需要添加android:sharedUserId=”android.uid.system”属性

但,该方法是非公开的,他只能运行在系统进程,第三方程序无法调用。

因为需要在Android.mk中添加LOCAL_CERTIFICATE := platform。

以上可以看出,在2.2,没有办法直接结束一个应用,而只能用自己的办法间接办到。

现提供几个方法,供参考:

1、抛异常强制退出:

该方法通过抛异常,使程序Force Close。

验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。

2、记录打开的Activity:

每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。

3、发送特定广播:

在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。

4、递归退出

在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。

除了第一个,都是想办法把每一个Activity都结束掉,间接达到目的。

但是这样做同样不完美。如果自己的应用程序对每一个Activity都设置了nosensor,在两个Activity结束的间隙,sensor可能有效了。

但至少,我们的目的达到了,而且没有影响用户使用。

为了编程方便,最好定义一个Activity基类,处理这些共通问题。


5、两个Activity之间怎么传递数据?

由MainActivity 通过最简单的Intent.putExtra方法,将参数传入,也可以用Bundle传入参数,

Bundle bundle = new Bundle();
bundle.putString("str", "Intent Demo");
intent.putExtras(bundle);


若需要获得返回值,则用startActivityForResult(),并需要知道返回的一个RESULT_CODE(int类型),可以理解为指针,用intent.setClass() 确定传递给那个类(这里包括Activity、Service等)。

第二个Activity

Intent intent=getIntent();

Bundle bundle=intent.getExtras();

String str=bundle.getString(“str”);

获得前一个Activity传来的参数,这里还需要返回给MainActivity参数,用到了setResult(RESULT_CODE, intent);

要说明的是RESULT_CODE必须与前一个Activity一致,否则就不能正常返回。

而第一个MainActivity通过重写onActivityResult()来取得相应的返回值。

若不需要返回,可以直接用startActivity()。

6、在启动一个Activity时就启动一个service

启动一个Activity时就启动一个service

在activity的onCreate里写

startService(xxx);

然后this.finish();结束自己..

这是最简单的方法 可能会有屏幕一闪的现象,如果UI要求严格的话用AIDL

根据service与activity的生命周期,选择在onCreate或onResume中startService;要记得stopService.

如何在一个Service中启动一个Activity

Intent intent = new Intent(Service.this,TestActivity.class);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(intent);

7、在同一个程序,但不同的activity中是否可以放在不同的Task任务栈中?

可以放在不同的Task中。

需要为不同的activity设置不同的taskaffinity属性,启动activity的Intent需要包含FLAG_ACTIVITY_NEW_TASK标记

怎么在启动一个activity时就启动一个service

将启动的service的语句放在onCreate()方法中。

8、Activity怎么和Service绑定,怎么在activity中启动自己对应的Service

Activity能进行绑定得益于Service的接口。在实现Service必须实现onBind方法

Service和Activity的连接可以用ServiceConnection来实现。

在实现一个新ServiceConnection,重写onServiceConnected和onServiceDisconnected方法,一旦连接建立,就能得到Service实例的引用。

执行绑定,调用bindServcie方法,传入一个选择了要绑定的Service的Intent和一个实现了的ServiceConnection实例

9、什么是Service以及描述下它的生命周期

Service是运行在后台的android组件,没有用户界面,不能与用户交互,可以运行在自己的进程,也可以运行在其他应用程序的上下文里。

Service随着启动形式的不同,其生命周期稍有差别。当用Context.startService()来启动时,Service的生命周期依次为:oncreate——>onStartCommand——>onDestroy 当用Context.bindService()启动时:onStart——>onBind——>onUnbind——>onDestroy

10、Service有哪些启动方法,有什么区别,怎么停用Service?

Service启动方式有两种;一是Context.startService和Context.bindService。

区别是通过startService启动时Service组件和应用程序没多大的联系;当用访问者启动之后,如果访问者不主动关闭,Service就不会关闭,Service组件之间

因为没什么关联,所以Service也不能和应用程序进行数据交互。

而通过bindService进行绑定时,应用程序可以通过ServiceConnection进行数据交互。

在实现Service时重写的onBind方法中,其返回的对象会传给ServiceConnection对象的onServiceConnected(ComponentName name, IBinder service)中的service参数;

也就是说获取了serivce这个参数就得到了Serivce组件返回的值。

Context.bindService(Intent intent,ServiceConnection conn,int flag)其中只要与Service连接成功conn就会调用其onServiceConnected方法停用Service使用Context.stopService

11、不用Service,B页面为音乐播放,从A跳到B,再返回,如何使音乐继续播放?

A使用startActivityForResult方法开启B,B类结束时调用finish;A类的Intent有一个子Activity结束事件onActivityResult,在这个事件里继续播放音乐。

12、什么是IntentService?有何有点?

IntentService也是一个Service,是Service的子类;

IntentService和Service有所不同,通过Looper和Thread来解决标准Service中处理逻辑的阻塞的问题

优点:Activity的进程,当处理Intent的时候,会产生一个对应的Service,Android的进程处理器现在会尽可能的不kill掉你。

13、什么时候使用Service?

比如播放多媒体的时候用户启动了其他的Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,在或者在后台记录你地理位置的改变等等

14、说说Activity、Intent、Service是什么关系

一个Activity通常是一个单独的屏幕,每一个Activity都被实现为一个单独的类,这些类都是从Activity基类中继承来的,Activity类显示有视图控件组成的用户接口,并对视图控件的事件做出响应。

Intent的调用是用来进行架构屏幕之间的切换的。

Intent是描述应用想要做什么。

Intent数据结果中最重要的部分是动作和动作对应的数据,一个动作对应一个动作数据。

Android Service是运行在后台的代码,不能与用户交互,可以运行在自己的进程,也可以运行在其他应用程序的上下文里。需要通过某一个Activity或其他Context对象来调用。

Activity\跳转到Activity,Activtiy启动Service,Service打开Activity都需要Intent表明跳转的意图,以及传递参数,Intent是这些组件间信号传递的传承者。

15、请介绍ContentProvider是如何实现数据共享的

ContentProvider是通过提供Uri来实现数据共享


16、请介绍下android的数据存储方式

Android提供了5种方式存储数据
使用SharedPreferences存储数据;
文件存储数据;
SQLite数据库存储数据
使用ContentProvider存储数据;
网络存储数据


17、android中常用的五种布局

线性布局LineayLayout、
相对布局RelativeLayout、
帧布局FrameLayout、
表格布局TablElAYOUT,
绝对布局AbsoluteLayout。


18、谈谈UI中,Padding和Margin有什么区别?

Padding是文字相对于边框,而Margin是边框相对于父窗体


19、请解释一下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。

子线程借用主线程里面的handler发送一条消息,这个消息会被线程放入消息队列里面,也就是message queue,

主线程里面有一个轮询器looper会发现消息队列里面有一条消息时,会调用handler消息处理执行handlermessage的方法去处理这个消息,这个handlemessage的方法可以更新ui控件内容了

20、AIDL的全称是什么?如何工作?能处理哪些类型的数据?

ADIL是一种接口定义语言,用于约束两个进程之间的通信规则,供编译器生成代码,实现android设备之间的进程通信。

进程之间的通信信息首先会被转换成AIDL协议消息,然后发送给对方,对方受到AIDL协议消息后在转换成相应的对象。AIDL支持类型包括java基础类型和String,List,Map,CharSequence,如果使用自定类型,必须实现Parcelable接口
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: