android面试题

1. Intent的几种有关Activity启动的方式有哪些,你了解每个含义吗?

            FLAG_ACTIVITY_BROUGHT_TO_FRONT 、这个标志一般不是由程序代码设置的,如在launchMode中设置

singleTask模式时系统帮你设定。

            FLAG_ACTIVITY_CLEAR_TOP、如果设置,并且这个Activity已经在当前的Task中运行,因此,不再是重

新启动一个这个Activity的实例,而是在这个Activity上方的 所有Activity都将关闭,然后这个Intent会作为一个新的

Intent投递到老的Activity(现在位于顶端)中。(注 Task 中的Activity 是存放在栈中的。。。)

例如, 假设一个Task中包含这些Activity:A,B,C,D。如果D调用了startActivity(),并且包含一个指向Activity B的 

Intent,那么,C和D都将结束,然后B接收到这个Intent,因此,目前stack(栈)的状况是:A,B。

上例中正在运行的Activity B既可以在onNewIntent()中接收到这个新的Intent,也可以把自己关闭然后重新启动来接收这

个Intent。如果它的启动模式声明为 “standard”(默认值),并且你没有在这个Intent中设置FLAG_ACTIVITY_SINGLE_TOP

标志,那么它将关闭然后重新创建;对于其它的启动模式,或者在这个 Intent中设置FLAG_ACTIVITY_SINGLE_TOP标志,都

将把这个Intent投递到当前这个实例的onNewIntent()中。这个启动模式还可以与FLAG_ACTIVITY_NEW_TASK结合起来使用:

用于启动一个Task中的根Activity,它会把那个Task中任何 运行的实例带入前台,然后清除它直到根Activity。这非常有

用,例如,当从Notification Manager处启动一个Activity。

            FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET、如果设置,这将在Task的Activity stack中设置一个

还原点,当Task恢复时,需要清理Activity。也就是说,下一次Task带着 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记

进入前台时(典型的操作是用户在主画面重启它),这个Activity和它之上的都将关闭,以至于用户不能再返回到它们,但

是可以回到之前的Activity。这在你的程序有分割点的时候很有用。例如,一个e-mail应用程序可能有一个操作是查看一个

附件,需要启动图片浏览Activity来显示。这个 Activity应该作为e-mail应用程序Task的一部分,因为这是用户在这Task

中触发的操作。然而,当用户离开这个Task,然后从主画面选择e-mail app,我们可能希望回到查看的会话中,但不是查看

图片附件,因为这让人困惑。通过在启动图片浏览时设定这个标志,浏览及其它启动的Activity在下次用户返回到mail程序

时都将全部清除。

            FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS、如果设置,新的Activity不会在最近启动的Activity的

列表中保存。

            FLAG_ACTIVITY_MULTIPLE_TASK   ,不要使用这个标志,除非你自己实现了应用程序启动器。与

FLAG_ACTIVITY_NEW_TASK结合起来使用,可以禁用把已存的Task送入前台的行 为。当设置时,新的Task总是会启动来处理

Intent,而不管这是是否已经有一个Task可以处理相同的事情。由于默认的系统不包含图形Task管理功能,因此,你不应该

使用这个标志,除非你提供给用户一种方式可以返回到已经启动的Task。如果FLAG_ACTIVITY_NEW_TASK标志没有设置,这个

标志被忽略。

            FLAG_ACTIVITY_NEW_TASK, 一个Activity一般通过调用startActivity()启动并加入到Task中。它同调

用者一样,进入同一个Task。然而,如果传递给startActivity()的Intent对象中包含FLAG_ACTIVITY_NEW_TASK时,系统会

搜索一个新的Task来容纳新的Activity。通常,如标志的名字所示,是一个新的Task。然而,并不是必须是。如果已经存在

一个Task与新Activity的affinity相同,这个Activity就会加入到那个Task中。如果不是,启动一个新的Task。如果启动它

的acitve和新Activity的affinity相同,那么新Activity的会进入启动它的acitve所在的Task.


 2. Activity和Task的启动模式有哪些? 每种含义是什么?

     主要有standard(标准)、singleTop、singleTask和singleInstance

     standard: 标准模式,一调用startActivity()方法就会产生一个新的实例。

   singleTop: 如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例,而只是调用Activity中的

newInstance()方法。如果不位于栈顶,会产生一个新的实例。

   singleTask: 会在一个新的task 中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。

   singleInstance: 这个跟singleTask基本上是一样,只有一个区别:在这个模式下的Activity实例所处的task 中,只能

有这个activity实例,不能有其他的实例。

   注 这些启动模式可以在功能 清单文件 中进行设置,<activity>中的launchMode属性。
"singleTask" and "singleInstance", should be used only when the activity has a MAIN and LAUNCHER filter

 

 3. 通过Intent传递一些二进制数据的方法有哪些?

  1). 使用Serializable接口实现序列化,这是Java常用的方法。

  2). 实现Parcelable接口,这里Android的部分类比如Bitmap类就已经实现了,同时Parcelable在

Android AIDL中交换数据也很常见的。

 4. 能说下Android应用的入口点吗?

   在Google的虚拟机中Application实例中已经实现了main方法真正的Android入口点是application的main



1.    请描述下Activity的生命周期


http://weizhulin.blog.51cto.com/1556324/311495

详细介绍一下这几个方法中系统在做什么以及我们应该做什么:

   onCreate:   在这里创建界面 ,做一些数据 的初始化工作

   onStart:    到这一步变成用户可见不可交互 的

   onResume:   变成和用户可交互 的,(在activity 栈系统通过栈的方式管理这些个      
                      Activity的最上面,运行完弹出栈,则回到上一个Activity)

   onPause:     到这一步是可见但不可交互 的,系统会停止动画 等消耗CPU 的事情
                    从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候
                    你的程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在

                    onResume里读出来,注意:这个方法里做的事情时间要短,因为下一
                    个activity不会等到这个方法完成才启动

   onstop:     变得不可见 ,被下一个activity覆盖了

   onDestroy: 这是activity被干掉前最后一个被调用方法了,可能是外面类调用finish方
                     法或者是系统为了节省空间将它暂时性的干掉,可以用isFinishing()来判
                     断它,如果你有一个Progress Dialog在线程中转动,请在onDestroy里
                     把他cancel掉,不然等线程结束的时候,调用Dialog的cancel方法会抛
                     异常的。

             
onPause,onstop, onDestroy,三种状态 下 activity都有可能被系统干掉
为了保证程序的正确性,你要在onPause()里写上持久层操作的代码,将用户编辑的内容都保存到存储介质上(一般都是数据库 )。实际工作中因为生命周期的变化而带来的问题也很多,比如你的应用程序起了新的线程在跑,这时候中断了,你还要去维护那个线程,是暂停还是杀掉还是数据 回滚,是吧?因为Activity可能被杀掉,所以线程中使用的变量和一些界面元素就千万要注意了,一般我都是采用Android的消息机制 [Handler,Message]来处理多线程和界面交互的问题。这个我后面会讲一些,最近因为这些东西头已经很大了,等我理清思绪再跟大家分享。

2.    如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
当你的程序中某一个Activity A 在运行时中,主动或被动地运行另一个新的Activity B 

这个时候A会执行

Java代码

  1. public 
  2. void onSaveInstanceState(Bundle outState)     
  3.     super.onSaveInstanceState(outState);     
  4.     outState.putLong("id", 1234567890);     
  5.     
  6.  
  7. public void onSaveInstanceState(Bundle outState)    super.onSaveInstanceState(outState);    outState.putLong("id", 1234567890);}  
  8.  


B 完成以后又会来找A, 这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回
收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数
savedInstanceState,没被收回的就还是onResume就好了。

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

Java代码


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

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


就像官方的Notepad教程 里的情况,你正在编辑某一个note,突然被中断,那么就把这个note的id记住,再起来的时候就可以根据这个id去把那个note取出来,程序就完整 一些。这也是看你的应用需不需要保存什么,比如你的界面就是读取一个列表,那就不需要特殊记住什么,哦, 没准你需要记住滚动条的位置...

3.    如何将一个Activity设置成窗口的样式
简单你只需要设置 一下Activity的主题就可以了在AndroidManifest.xml 中定义 Activity的
地方一句话:


Xml代码

      android :theme="@android:style/Theme.Dialog"   

  1.  
  2. android:theme="@android:style/Theme.Dialog"   
  3.  

这就使你的应用程序变成对话框的形式弹出来了,或者Xml代码

  1. android:theme="@android:style/Theme.Translucent"   
  2.  
  3. android:theme="@android:style/Theme.Translucent"   
  4.  

就变成半透明的,[友情提示-.-]类似的这种activity的属性可以在android.R.styleable 类的AndroidManifestActivity 方法中看到,AndroidManifest.xml中所有元素的属性的介绍都可以参考这个类android.R.styleable

上面说的是属性名称,具体有什么值是在android.R.style中 可以看到,比如这个"@android:style/Theme.Dialog" 就对应于android.R.style.Theme_Dialog ,('_'换成'.' <--注意:这个是文章内容不是笑脸)就可以用在描述文件 中了,找找类定义和描述文件中的对应关系就都明白了。

4. 如何退出Activity

对于单一Activity的应用来说,退出很简单,直接finish()即可。 当然,也可以用killProcess()和System.exit()这样的方法。 现提供几个方法,供参考: 1、抛异常强制退出: 该方法通过抛异常,使程序Force Close。
可以使用实现UncaughtExceptionHandler来避免弹出force close窗口

public class MyApplication extends Application implements UncaughtExceptionHandler {
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
}

@Override
public void uncaughtException(Thread thread, Throwable ex) {
thread.setDefaultUncaughtExceptionHandler( this);
}

}
2、记录打开的Activity:
每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。
3、发送特定广播:
在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。
4、递归退出
在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。
除了第一个,都是想办法把每一个Activity都结束掉,间接达到目的。
但是这样做同样不完美。
你会发现,如果自己的应用程序对每一个Activity都设置了nosensor,在两个Activity结束的间隙,sensor可能有效了。
但至少,我们的目的达到了,而且没有影响用户使用。
为了编程方便,最好定义一个Activity基类,处理这些共通问题。

5.请介绍下Android中常用的五种布局

Android布局是应用界面开发的重要一环,在Android中,共有五种布局方式,分别是:FrameLayout(框架布 局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)。     一、FrameLayout     这个布局可以看成是墙脚堆东西,有一个四方的矩形的左上角墙脚,我们放了第一个东西,要再放一个,那就在放在原来放的位置的上面,这样依次的放,会盖住原来的东西。这个布局比较简单,也只能放一点比较简单的东西。     二、LinearLayout 线性布局,这个东西,从外框上可以理解为一个div,他首先是一个一个从上往下罗列在屏幕上。每一个LinearLayout里面又可分为垂直布局 (android:orientation="vertical")和水平布局(android:orientation="horizontal" )。当垂直布局时,每一行就只有一个元素,多个元素依次垂直往下;水平布局时,只有一行,每一个元素依次向右排列。     linearLayout中有一个重要的属性 android:layout_weight="1",这个weight在垂直布局时,代表行距;水平的时候代表列宽;weight值越大就越大。     三、AbsoluteLayout 绝对布局犹如div指定了absolute属性,用X,Y坐标来指定元素的位置android:layout_x="20px" android:layout_y="12px" 这种布局方式也比较简单,但是在垂直随便切换时,往往会出问题,而且多个元素的时候,计算比较麻烦。     四、RelativeLayout     相对布局可以理解为某一个元素为参照物,来定位的布局方式。主要属性有:     相对于某一个元素     android:layout_below="@id/aaa" 该元素在 id为aaa的下面     android:layout_toLeftOf="@id/bbb" 改元素的左边是bbb     相对于父元素的地方     android:layout_alignParentLeft="true"  在父元素左对齐     android:layout_alignParentRight="true" 在父元素右对齐     还可以指定边距等,具体详见API     五。TableLayout     表格布局类似Html里面的Table。每一个TableLayout里面有表格行TableRow,TableRow里面可以具体定义每一个元素,设定他的对齐方式 android:gravity="" 。     每一个布局都有自己适合的方式,另外,这五个布局元素可以相互嵌套应用,做出美观的界面。

6. 请介绍下Android的数据存储方式

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

先 说下,Preference,File, DataBase这三种方式分别对应的目录是/data/data/Package Name/Shared_Pref, /data/data/Package Name/files, /data/data/Package Name/database 。

在Android中通常使用File存储方式是用 Context.openFileOutput(String fileName, int mode)和Context.openFileInput(String fileName)。
Context.openFileOutput(String fileName, int mode)生成的文件自动存储在/data/data/Package Name/files目录下,其全路径是/data/data/Package Name/files/fileName 。注意下,这里的参数fileName不可以包含路径分割符(如"/")。
通常来说,这种方式生成的文件只能在这个apk内访问。但这个结论是指使用Context.openFileInput(String fileName)的方式。使用这种方式,每个apk只可以访问自己的/data/data/Package Name/files目录下的文件,原因很简单,参数fileName中不可以包含路径分割符,Android会自动在/data/data /Package Name/files目录下寻找文件名为fileName的文件。

一:使用SharedPreferences存储数据

首先说明SharedPreferences存储方式,它是 Android提供的用来存储一些简单配置信息的一种机制,例如:登录用户的用户名与密码。其采用了Map数据结构来存储数据,以键值的方式存储,可以简 单的读取与写入,具体实例如下:
void ReadSharedPreferences(){
String strName,strPassword;
SharedPreferences   user = getSharedPreferences(“user_info”,0);
strName = user.getString(“NAME”,””);
strPassword = user getString(“PASSWORD”,””);
}
void WriteSharedPreferences(String strName,String strPassword){
SharedPreferences   user = getSharedPreferences(“user_info”,0);
uer.edit();
user.putString(“NAME”, strName);
user.putString(“PASSWORD” ,strPassword);
user.commit();
}
数据读取与写入的方法都非常简单,只是在写入的时候有些区别:先调用edit()使其处于编辑状态,然后才能修改数据,最后使用commit()提交修改 的数据。实际上SharedPreferences是采用了XML格式将数据存储到设备中,在DDMS中的File Explorer中的/data/data/<package name>/shares_prefs下。以上面的数据存储结果为例,打开后可以看到一个user_info.xml的文件,打开后可以看到:
<?xml version=”1.0″ encoding=”UTF-8″?>
<map>
<string name=”NAME”>moandroid</string>
<string name=” PASSWORD”>SharedPreferences</string>
</map>
使用SharedPreferences是有些限制的:只能在同一个包内使用,不能在不同的包之间使用。

二:文件存 储数据

文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与 Java中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。 FilterInputStream, FilterOutputStream等可以到Java io package说明中去详细学习,不再此详细说明,具体实例如下:
String fn = “moandroid.log”;
FileInputStream fis = openFileInput(fn);
FileOutputStream fos = openFileOutput(fn,Context.MODE_PRIVATE);
除此之外,Android还提供了其他函数来操作文件,详细说明请阅读Android SDK。


三:网络存储数据


网络存储方式,需要与Android 网络数据包打交道,关于Android 网络数据包的详细说明,请阅读Android SDK引用了Java SDK的哪些package?。

四:ContentProvider

1、ContentProvider简介


当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数 据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数 据,需要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。?

2、Uri类简介


Uri代表了要操作的数据,Uri主要包含了两部分信息:1.需要操作的ContentProvider ,2.对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:
1.scheme:ContentProvider(内容提供者)的scheme已经由Android所规定为:content://。


2.主机名(或Authority):用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。


3.路径(path):可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:
? 要操作contact表中id为10的记录,可以构建这样的路径:/contact/10
? 要操作contact表中id为10的记录的name字段, contact/10/name
? 要操作contact表中的所有记录,可以构建这样的路径:/contact?
要操作的数据不一定来自数据库,也可以是文件等他存储方式,如下:
要操作xml文件中contact节点下的name节点,可以构建这样的路径:/contact/name
如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:
Uri uri = Uri.parse("content://com.changcheng.provider.contactprovider/contact")
3、UriMatcher、ContentUrist和ContentResolver简介

因为Uri代表了要操作的数据,所以我们很经常需要解析Uri,并从 Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。掌握它们的使用,会便于我们的开发工作。
? UriMatcher:用于匹配Uri,它的用法如下:


1.首先把你需要匹配Uri路径全部给注册上,如下:
//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(-1)。
UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//如果match()方法匹配content://com.changcheng.sqlite.provider.contactprovider /contact路径,返回匹配码为1
uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact”, 1);//添加需要匹配uri,如果匹配就会返回匹配码
//如果match()方法匹配 content://com.changcheng.sqlite.provider.contactprovider/contact/230路径,返 回匹配码为2
uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact/#”, 2);//#号为通配符

2.注册完需要匹配的Uri后,就可以使用uriMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用 addURI()方法传入的第三个参数,假设匹配 content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回的匹配 码为1。
?
ContentUris:用于获取Uri路径后面的ID部分,它有两个比较实用的方法:
? withAppendedId(uri, id)用于为路径加上ID部分
? parseId(uri)方法用于从路径中获取ID部分
? ContentResolver:当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用 ContentResolver 类来完成,要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法,来操作数据。

五:总结说明


以上5中存储方式,在以后的开发过程中,根据设计目标、性能需求、空间需求等找到 合适的数据存储方式。Android 中的数据存储都是私有的,其他应用程序都是无法访问的,除非通过ContentResolver获取其他程序共享的数据。采用文件方式对外共享数据,需要 进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。

8.如何启用Service,如何停用Service

Android中的服务和windows中的服务是类似的 东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。服务的开发比较简单,如下:

第一步:继承Service

public class SMSService extends Service {

}

第二步:在AndroidManifest.xml文 件中的<application>节点里对服务进 行配置:

<service android:name=".SMSService" />

 

服务不能自己运行,需要通过调用Context.startService()Context.bindService()方法启动服务。这两个方法都 可以启动Service,但是它们的使用场合有所不同。使用startService()方法启用服务,调用者与服务之间没有关连, 即使调用者退出了,服务仍然运行。使用bindService()方 法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。

 

如果打算采用Context.startService()方 法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方 法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调 用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调 用onDestroy()方法。

 

如果打算采用Context.bindService()方 法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方 法,接着调用onBind()方法。这个时候调用者和服务绑定 在一起,调用者退出了,系统就会先调用服务的onUnbind()方 法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()onBind()方 法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑 定,可以调用unbindService()方法,调用该方法 也会导致系统调用服务的onUnbind()-->onDestroy()方 法。

服务常用生命周期回调方法如下:

onCreate() 该方法在服务被创建 时调用,该方法只会被调用一次,无论调用多少次startService()bindService()方法,服务也只被创建一次。

onDestroy()该方法在服务被终止时调用。

与采用Context.startService()方 法启动服务有关的生命周期方法

onStart() 只有采用Context.startService()方 法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用startService()方 法尽管不会多次创建服务,但onStart() 方法会被多次调用。

与采用Context.bindService()方 法启动服务有关的生命周期方法

onBind()只有采用Context.bindService()方 法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。

onUnbind()只有采用Context.bindService()方 法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用

采用Context.startService()方法启动服务的代码如下:

public class HelloActivity extends Activity {

    @Override

    public void onCreate(Bundle savedInstanceState) {

        ......

        Button button =(Button) this.findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener(){

       public void onClick(View v) {

              Intent intent = new Intent(HelloActivity.this, SMSService.class);

              startService(intent);

       }});       

    }

}

 

采用Context. bindService()方法启动服务的代码如下:

public class HelloActivity extends Activity {

     ServiceConnection conn = new ServiceConnection() {

              public void onServiceConnected(ComponentName name, IBinder service) {

           }

           public void onServiceDisconnected(ComponentName name) {

           }

     };

    @Override public void onCreate(Bundle savedInstanceState) { 

        Button button =(Button) this.findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener(){

               public void onClick(View v) {

                  Intent intent = new Intent(HelloActivity.this, SMSService.class);

                  bindService(intent, conn, Context.BIND_AUTO_CREATE);

                  //unbindService(conn);//解除绑定

          }});       

    }

}



Android 面试收集(一)
2012-04-23 15:07

1. 什么是Activity?

 

四大组件之一,一般的,一个用户交互界面对应一个activity, activity 是Context的子类,同时实现了window.callback和keyevent.callback, 可以处理与窗体用户交互的事件. 我开发常用的的有ListActivity  , PreferenceActivity 等…如果界面有共同的特点或者功能的时候,还会自己定义一个BaseActivity.

 

2. 请描述一下Activity生命周期。

 

生命周期描述的是一个类 从创建(new出来)到死亡(垃圾回收)的过程中会执行的方法..

在这个过程中 会针对不同的生命阶段会调用不同的方法

Activity从创建到销毁有多种状态,从一种状态到另一种状态时会激发相应的回调方法,这些回调方法包括:oncreate ondestroy onstop onstart onresume onpause

其实这些方法都是两两对应的,onCreate创建与onDestroy销毁;

onStart可见与onStop不可见;onResume可编辑(即焦点)与onPause;

这6个方法是相对应的,那么就只剩下一个onRestart方法了,这个方法在什么时候调用呢?

答案就是:在Activity被onStop后,但是没有被onDestroy,在再次启动此Activity时就调用onRestart(而不再调用onCreate)方法;

如果被onDestroy了,则是调用onCreate方法。

最后讲自己项目中的经验,比如说豆瓣客户端每次进入某个界面的时候要刷新列表,这个刷新列表的操作 就放在onStart()的方法里面.这样保证每次用户看到的数据都是最新的.

多媒体播放, 播放来电话. onStop() 视频, 视频声音设置为0 , 记录视频播放的位子

onStart() 根据保存的状态恢复现场.

在读文档的时候 还发现 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,然后重新加载

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越处于栈底,被回收的可能性越大.

protected void onSaveInstanceState(Bundle outState) {

       super.onSaveInstanceState(outState);

       outState.putLong("id", 1234567890);

}

public void onCreate(Bundle savedInstanceState) {

//判断 savedInstanceState是不是空.

//如果不为空就取出来

        super.onCreate(savedInstanceState);

}

7. 如何退出Activity?如何安全退出已调用多个Activity的Application?

1、抛异常强制退出:

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

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

2、记录打开的Activity:

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

3、发送特定广播:

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

4、递归退出

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

上面是网上的一些做法.

其实 可以通过 intent的flag 来实现.. intent.setFlag(FLAG_ACTIVITY_CLEAR_TOP)激活一个新的activity,然后在新的activity的oncreate方法里面 finish掉

讲一讲你对activity的理解

把上面的几点用自己的心得写出来

8. service是否在main thread中执行, service里面是否能执行耗时的操作?

默认情况,如果没有显示的指定service所运行的进程, Service和activity是运行在当前app所在进程的main thread(UI主线程)里面

9. 两个Activity之间怎么传递数据?

基本数据类型可以通过.  Intent 传递数据 

extras.putDouble(key, value)

intent.putExtras(extras)

Application 全局里面存放 对象 ,自己去实现自己的application的这个类,基础系统的application , 每个activity都可以取到

让对象实现 implements  Serializable 接口把对象存放到文件上.  

让类实现Serializable 接口,然后可以通过 ObjectOutputStream ObjectInputStream

       //ObjectInputStream

       //ObjectOutputStream

           FileOutputStream fos = new FileOutputStream(new File("/sdcard/studnet.obj"));

           ObjectOutputStream oos = new ObjectOutputStream(fos);

           oos.writeObject(new Student());

10. 怎么让在启动一个Activity是就启动一个service?

在activity的onCreate()方法里面 startService();

 

11. 同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?

比方说在激活一个新的activity时候, 给intent设置flag

Intent的flag添加FLAG_ACTIVITY_NEW_TASK

这个被激活的activity就会在新的task栈里面…

12. Activity怎么和service绑定,怎么在activity中启动自己对应的service?

       bindService().  让activity能够访问到 service里面的方法

       构建一个intent对象,

Intent service = new Intent(this,MyService.class);

通过bindService的方法去启动一个服务,

       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

              }

       }

13. 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, 再StopService。

如果一个service通过startService 被start之后,多次调用startService 的话,service会多次调用onStart方法。多次调用stopService的话,service只会调用一次onDestroyed方法。

如果一个service通过bindService被start之后,多次调用bindService的话,service只会调用一次onBind方法。

多次调用unbindService的话会抛出异常。


15. 不用service,B页面为音乐播放,从A跳转到B,再返回,如何使音乐继续播放?

这个问题问的很山寨.默认不做任何处理,B里面的音乐都能播放.

遇到问题, 可以随机应变,灵活发挥,多考虑些细节,比如说这个题就可以这样说,说说你对startActivityForResult的理解()

A开启B的时候,用startActivityForResult()方法, B返回的时候把播放的状态信息返回给A ,A继续播放音乐.


16. 什么是IntentService?有何优点?

    普通的service ,默认运行在ui main 主线程

    Sdk给我们提供的方便的,带有异步处理的service类,

       OnHandleIntent() 处理耗时的操作

17. 什么时候使用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可以使用startForeground(int, Notification)方法来将service设置为前台状态,那么系统就认为是对用户可见的,并不会在内存不足时killed。

如果有其他的应用组件作为Service,Activity等运行在相同的进程中,那么将会增加该进程的重要性。

       1.Service的特点可以让他在后台一直运行,可以在service里面创建线程去完成耗时的操作.

       2.Broadcast receiver捕获到一个事件之后,可以起一个service来完成一个耗时的操作.

       3.远程的service如果被启动起来,可以被多次bind, 但不会重新create.  索爱手机X10i的人脸识别的service可以被图库使用,可以被摄像机,照相机等程序使用.

18. 请描述一下Intent 和 Intent Filter。

       Android 中通过 Intent 对象来表示一条消息,一个 Intent 对象不仅包含有这个消息的目的地,还可以包含消息的内容,这好比一封 Email,其中不仅应该包含收件地址,还可以包含具体的内容。对于一个 Intent 对象,消息“目的地”是必须的,而内容则是可选项。

通过Intent 可以实现各种系统组件的调用与激活. 

Intent filter: 可以理解为邮局或者是一个信笺的分拣系统…

这个分拣系统通过3个参数来识别

Action: 动作   

Data: 数据uri  

Category : 而外的附加信息

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 列表中包含了“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

19. Intent传递数据时,可以传递哪些类型数据?

       1.一般的基本数据类型 Intent .putextra() intent.getextra();

       2.数据的uri, intent.setData() intent.getData();

20. 说说Activity,Intent,Service是什么关系 。

       麦当劳和麦当娜的关系是什么关系?

       这种问题,就讲下activity,讲一下service,说一下 通过intent去激活组件,传递数据.

       说自己项目中有这样一个网络更新的功能,显示界面就用的activity, 后台有个service每隔半小时都去访问下服务器获取更新的数据…开启服务用的是intent来开启

21. 请描述一下Broadcast Receiver。

 用于接收系统的广播通知, 系统会有很多sd卡挂载,手机重启,广播通知,低电量,来电,来短信等….

 手机卫士中自定义一个broadcast receiver来获取短信到来的广播, 根据黑名单来判断是否拦截该短信.

 画画板生成图片后,发送一个sd挂载的通知,通知系统的gallery去获取到新的图片.

22. 在manifest和代码中如何注册和使 用 broadcast receiver 。

       设置广播接收者的优先级,设置广播接受者的action名字 等…

详细见工程代码.

23. 请介绍下ContentProvider是如何实现数据共享的。

       把自己的数据通过uri的形式共享出去

       需要去实现一个类去继承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[])

}

24. 请介绍下Android的数据存储方式。

       文件  访问权限.

       数据库 sqlite

       SharedPreference

       网络

25. 为什么要用ContentProvider?它和sql的实现上有什么差别?

       屏蔽数据存储的细节,对用户透明,用户只需要关心操作数据的uri就可以了

        不同app之间共享,操作数据

       Sql也有增删改查的方法.

       但是contentprovider 还可以去增删改查本地文件.

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"

android:layout_y="12px"

指定平板机型的游戏开发中经常用到绝对布局

指定机型的平板游戏开发.

  RelativeLayout

    相对布局可以理解为某一个元素为参照物,来定位的布局方式。主要属性有:

        相对于某一个元素

    android:layout_below="@id/aaa" 该元素在 id为aaa的下面

    android:layout_toLeftOf="@id/bbb" 改元素的左边是bbb

        相对于父元素的地方

     android:layout_alignParentLeft="true"  在父元素左对齐

    android:layout_alignParentRight="true" 在父元素右对齐

  TableLayout

表格布局类似Html里面的Table。每一个TableLayout里面有表格行TableRow,TableRow里面可以具体定义每一个元素,设定他的对齐方式 android:gravity="" 。

每一个布局都有自己适合的方式,另外,这五个布局元素可以相互嵌套应用,做出美观的界面。

webview

27. 谈谈UI中, Padding和Margin有什么区别?

Padding 文字对边框, margin是控件对父窗体.

28. widget相对位置的完成在activity的哪个生命周期阶段实现。

 这个题没看懂… widget可以理解成桌面小控件, 也可以理解成 某个button, imageview这样的控件…

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

30. AIDL的全称是什么?如何工作?

Android interface definition language (android接口定义语言) , 用来跨进程的访问方法,

访问远程的服务的方法. 如何工作 day7 queryStudent . 

手机卫士 Itelephony 接口挂断电话.

31. 请解释下Android程序运行时权限与文件系统权限的区别。

   Android程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 打电话,访问网络,获取坐标,读写sd卡,读写联系人等..安装的时候会提示用户…

文件系统的权限是linux权限. 比如说sharedpreference里面的Context.Mode.private  Context.Mode.world_read_able   Context.Mode_world_writeable  

32. 系统上安装了多种浏览器,能否指定某浏览器访问指定页面?

   找到对应的浏览器的意图,传递数据URI , 激活这个意图

33. 对android主线程的运用和理解。

   主ui线程不能执行耗时的操作,

34. 对android虚拟机的理解,包括内存管理机制垃圾回收机制。

虚拟机很小,空间很小,谈谈移动设备的虚拟机的大小限制 16M , 谈谈加载图片的时候怎么处理大图片的,

垃圾回收,没有引用的对象,在某个时刻会被系统gc掉.

35. Framework工作方式及原理,Activity是如何生成一个view的,机制是什么。

 可以讲下activity的源码,比如说 每个activity里面都有window.callback和keyevent.callback,一些回调的接口或者函数吧. 框架把activity创建出来就会调用里面的这些回调方法,会调用activity生命周期相关的方法.

Activity创建一个view是通过 ondraw 画出来的, 画这个view之前呢,还会调用onmeasure方法来计算显示的大小.

36.  android本身的一些限制,比如apk包大小限制,读取大文件时的时间限。

 这个问题问的有问题, apk包大小限制不好说,极品飞车有100M 还是能装到手机上,

apk包,精简包, 素材存放在服务器. 游戏程序.

读大文件的时间限制应该是main线程里面的时间限制吧.5秒

37. 如何加载的音乐信息,如何改善其效率。

Android提供mediascanner,mediaStore等接口, 音乐文件的信息都会存放到系统的数据库表中,可以通过content provider获取,

显示出来,改善效率,是个常见问题, 可以从以下几个方面作答,

分批加载数据, 延时加载数据, 合理使用缓存等...

38. ListView如何提高其效率?

 复用convertview , 异步加载数据,分页加载数据,

使用静态的view对象 避免创建过多的view.

39. 启动应用后,改变系统语言,应用的语言会改变么?

  不会

40. 启动一个程序,可以主界面点击图标进入,也可以从一个程序中跳转过去,二者有什么区别?

 区别是根据activity在manifest里面的配置,这个activity可能会放在不同的task栈里面

41. Android程序与Java程序的区别?

  Android程序用android sdk开发,java程序用javasdk开发.

Android SDK引用了大部分的Java SDK,少数部分被Android SDK抛弃,比如说界面部分,java.awt package除了java.awt.font被引用外,其他都被抛弃,在Android平台开发中不能使用。

将Java 游戏或者j2me程序移植到Android平台的过程中,Android  SDK与Java SDK的区别是很需要注意的地方。

42. Android中Task任务栈的分配。

首先我们来看下Task的定义,Google是这样定义Task的:a task is what the user experiences as an "application." It's a group of related activities, arranged in a stack. A task is a stack of activities, not a class or an element in the manifest file. 这意思就是说Task实际上是一个Activity栈,通常用户感受的一个Application就是一个Task。从这个定义来看,Task跟Service或者其他Components是没有任何联系的,它只是针对Activity而言的。

Activity有不同的启动模式, 可以影响到task的分配

Task,简单的说,就是一组以栈的模式聚集在一起的Activity组件集合。它们有潜在的前后驱关联,新加入的Activity组件,位于栈顶,并仅有在栈顶的Activity,才会有机会与用户进行交互。而当栈顶的Activity完成使命退出的时候,Task会将其退栈,并让下一个将跑到栈顶的Activity来于用户面对面,直至栈中再无更多Activity,Task结束。

事件

Task栈(粗体为栈顶组件)

点开Email应用,进入收件箱(Activity A)

A

选中一封邮件,点击查看详情(Activity B)

AB

点击回复,开始写新邮件(Activity C)

ABC

写了几行字,点击选择联系人,进入选择联系人界面(Activity D)

ABCD

选择好了联系人,继续写邮件

ABC

写好邮件,发送完成,回到原始邮件

AB

点击返回,回到收件箱

A

退出Email程序

null

如上表所示,是一个实例。从用户从进入邮箱开始,到回复完成,退出应用整个过程的Task栈变化。这是一个标准的栈模式,对于大部分的状况,这样的Task模型,足以应付,但是,涉及到实际的性能、开销等问题,就会变得残酷许多。

比如,启动一个浏览器,在Android中是一个比较沉重的过程,它需要做很多初始化的工作,并且会有不小的内存开销。但与此同时,用浏览器打开一些内容,又是一般应用都会有的一个需求。设想一下,如果同时有十个运行着的应用(就会对应着是多个Task),都需要启动浏览器,这将是一个多么残酷的场面,十个Task栈都堆积着很雷同的浏览器Activity,

是多么华丽的一种浪费啊。

于是你会有这样一种设想,浏览器Activity,可不可以作为一个单独的Task而存在,不管是来自那个Task的请求,浏览器的Task,都不会归并过去。这样,虽然浏览器Activity本身需要维系的状态更多了,但整体的开销将大大的减少,这种舍小家为大家的行为,还是很值得歌颂的

standard", "singleTop", "singleTask", "singleInstance"。

standard模式, 是默认的也是标准的Task模式,在没有其他因素的影响下,使用此模式的Activity,会构造一个Activity的实例,加入到调用者的Task栈中去,对于使用频度一般开销一般什么都一般的Activity而言,standard模式无疑是最合适的,因为它逻辑简单条理清晰,所以是默认的选择。

而singleTop模式,基本上于standard一致,仅在请求的Activity正好位于栈顶时,有所区别。此时,配置成singleTop的Activity,不再会构造新的实例加入到Task栈中,而是将新来的Intent发送到栈顶Activity中,栈顶的Activity可以通过重载onNewIntent来处理新的Intent(当然,也可以无视...)。这个模式,降低了位于栈顶时的一些重复开销,更避免了一些奇异的行为(想象一下,如果在栈顶连续几个都是同样的Activity,再一级级退出的时候,这是怎么样的用户体验...),很适合一些会有更新的列表Activity展示。一个活生生的实例是,在Android默认提供的应用中,浏览器(Browser)的书签Activity(BrowserBookmarkPage),就用的是singleTop。

singleTask,和singleInstance,则都采取的另辟Task的蹊径。

标志为singleTask的Activity,最多仅有一个实例存在,并且,位于以它为根的Task中。所有对该Activity的请求,都会跳到该Activity的Task中展开进行。singleTask,很象概念中的单件模式,所有的修改都是基于一个实例,这通常用在构造成本很大,但切换成本较小的Activity中。最典型的例子,还是浏览器应用的主Activity(名为Browser...),它是展示当前tab,当前页面内容的窗口。它的构造成本大,但页面的切换还是较快的,于singleTask相配,还是挺天作之合的。

singleInstance显得更为极端一些。在大部分时候singleInstance与singleTask完全一致,唯一的不同在于,singleInstance的Activity,是它所在栈中仅有的一个Activity,如果涉及到的其他Activity,都移交到其他Task中进行。这使得singleInstance的Activity,像一座孤岛,彻底的黑盒,它不关注请求来自何方,也不计较后续由谁执行。在Android默认的各个应用中,很少有这样的Activity,在我个人的工程实践中,曾尝试在有道词典的快速取词Activity中采用过,

是因为我觉得快速取词入口足够方便(从notification中点选进入),并且会在各个场合使用,应该做得完全独立。

43. 在Android中,怎么节省内存的使用,怎么主动回收内存?

  回收已经使用的资源,

  合理的使用缓存

合理设置变量的作用范围…

 System.gc();

44. 不同工程中的方法是否可以相互调用?

  可以,列举aidl访问远程服务的例子.

45. 在Android中是如何实现判断区分通话记录中的电话状态,去电,来电、未接来电?

Day8 showAddressService.java

46. dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念

Dvm的进程是dalivk虚拟机进程,每个android程序都运行在自己的进程里面,

每个android程序系统都会给他分配一个单独的uid(user id),

每个dvm都是linux里面的一个进程.所以说这两个进程是一个进程.

47. sim卡的EF 文件有何作用

  Sim卡相关的东西,没接触过

48. 如何判断是否有SD卡?

  配置文件中有sd卡的权限, 通过environment的静态方法,

if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

49. 嵌入式操作系统内存管理有哪几种, 各有何特性。

页式,段式,段页,等 …

50. 什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?

实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。主要用于工业控制、军事设备、航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。又可分为软实时和硬实时两种,而android是基于linux内核的,因此属于软实时。

51. 一条最长的短信息约占多少byte?

中文70(包括标点),英文160,160个字节 这个说法不准确,要跟手机制式运营商等信息有关.

做实验,看源码

ArrayList<String> msgs = sms.divideMessage(message);

         for (String msg : msgs) { 

            sms.sendTextMessage(phoneNumber, null, msg, pi, null);      

}

52. Linux中跨进程通信的几种方式 。

# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

# 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

# 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

# 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。

# 套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

53. 谈谈对Android NDK的理解。

       1.什么时候用ndk,  实时性要求高,游戏,图形渲染,  opencv , ffmpeg , rmvb avi 搞清. ffmpeg, opencore.

2.为什么用ndk,ndk的优点 ,缺点 ,

我们项目中那些地方用到了ndk, 

54. 谈谈Android的优点和不足之处。

1、开放性,开源

2、挣脱运营商束缚

3、丰富的硬件选择

4、不受任何限制的开发商

5、无缝结合的Google应用

缺点也有5处:

1、安全问题、隐私问题

2、卖手机的不是最大运营商

3、运营商对Android手机仍然有影响

4、山寨化严重

5、过分依赖开发商,缺乏标准配置

55. Android系统中GC什么情况下会出现内存泄露呢?  视频编解码/内存泄露

导致内存泄漏主要的原因是,先前申请了内存空间而忘记了释放。如果程序中存在对无用对象的引用,那么这些对象就会驻留内存,消耗内存,因为无法让垃圾回收器GC验证这些对象是否不再需要。如果存在对象的引用,这个对象就被定义为"有效的活动",同时不会被释放。要确定对象所占内存将被回收,我们就要务必确认该对象不再会被使用。典型的做法就是把对象数据成员设为null或者从集合中移除该对象。但当局部变量不需要时,不需明显的设为null,因为一个方法执行完毕时,这些引用会自动被清理。

Java带垃圾回收的机制,为什么还会内存泄露呢?

Vector v = new Vector(10);    

 for (int i = 1; i < 100; i++)      {      

 Object o = new Object();       

v.add(o);       

o = null;     

}//此时,所有的Object对象都没有被释放,因为变量v引用这些对象。 

Java 内存泄露的根本原因就是 保存了不可能再被访问的变量类型的引用

56. Android UI中的View如何刷新。

 拿到view调用Invalide()方法,查看画画板里面更新imageview的方法

在子线程里面可以通过postInvalide()方法;

57. 简单描述下Android 数字签名。

Android 数字签名

       在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系

Android系统要求每一个安装进系统的应用程序都是经过数字证书签名的,数字证书的私钥则保存在程序开发者的手中。Android将数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,不是用来决定最终用户可以安装哪些应用程序。

这个数字证书并不需要权威的数字证书签名机构认证(CA),它只是用来让应用程序包自我认证的。

同一个开发者的多个程序尽可能使用同一个数字证书,这可以带来以下好处。

(1)有利于程序升级,当新版程序和旧版程序的数字证书相同时,Android系统才会认为这两个程序是同一个程序的不同版本。如果新版程序和旧版程序的数字证书不相同,则Android系统认为他们是不同的程序,并产生冲突,会要求新程序更改包名。

(2)有利于程序的模块化设计和开发。Android系统允许拥有同一个数字签名的程序运行在一个进程中,Android程序会将他们视为同一个程序。所以开发者可以将自己的程序分模块开发,而用户只需要在需要的时候下载适当的模块。

在签名时,需要考虑数字证书的有效期:

(1)数字证书的有效期要包含程序的预计生命周期,一旦数字证书失效,持有改数字证书的程序将不能正常升级。

(2)如果多个程序使用同一个数字证书,则该数字证书的有效期要包含所有程序的预计生命周期。

(3)Android Market强制要求所有应用程序数字证书的有效期要持续到2033年10月22日以后。

Android数字证书包含以下几个要点:

 (1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序

 (2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证

 (3)如果要正式发布一个Android ,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。

 (4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。

58. 什么是ANR 如何避免它?

在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择让程序继续运行,但是,他们在使用你的应用程序时,并不希望每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样,系统不会显示ANR给用户。

Activity 5秒  broadcast10秒

耗时的操作 worker thread里面完成, handler message…AsynTask , intentservice.等…

59. 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动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。

62. 说说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中显示。

63. 通过点击一个网页上的url 就可以完成程序的自动安装,描述下原理

  Day11 AddJavascriptInterface

64,Service和Activity在同一个线程吗

默认情况同一线程 main主线程 ui线程

65,java中的soft reference是个什么东西

 StrongReference 是 Java 的默认引用实现, 它会尽可能长时间的存活于 JVM 内, 当没有任何对象指向它时 GC 执行后将会被回收 

SoftReference 会尽可能长的保留引用直到 JVM 内存不足时才会被回收(虚拟机保证), 这一特性使得 SoftReference 非常适合缓存 

应用详细见豆瓣客户端图片的缓存

66,udp连接和TCP的不同之处

 tcp/滑动窗口协议. 拥塞控制.

67, android开发中怎么去调试bug

逻辑错误

1.断点 debug  

2. logcat ,

界面布局,显示 hierarchyviewer.bat

68.service里面可以弹土司么

可以

69.写10个简单的linux命令

ls cd mv rm cat kill ps tar su chmod cp pwd tail grep find ifconfig  ping

tracert  tcpdump 

70 JNI调用常用的两个参数

 JNIEnv *env, jobject javaThis

71. 书写出android工程的目录结构 

72. ddms(dailvk debug manage system )  和traceview的区别.

1.在应用的主activity的onCreate方法中加入Debug.startMethodTracing("要生成的traceview文件的名字");

2.同样在主activity的onStop方法中加入Debug.stopMethodTracing();

3.同时要在AndroidManifest.xml文件中配置权限

   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

3.重新编译,安装,启动服务,测试完成取对应的traceview文件(adb pull /sdcard/xxxx.trace)。

4.直接在命令行输入traceview xxxxtrace,弹出traceview窗口,分析对应的应用即可。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值