40个Android问题

1、 Android的四大组件是哪些,它们的效劳?

答:Activity:Activity是Android程序与用户交互的窗口,是Android构造块中最大旨的一种,它需要为保障各界面的图景,做过多持久化的政工,妥善保管生命周期以及部分跳转逻辑

service:后台服务于Activity,封装有一个完整的功效逻辑实现,接受上层指令,完成有关的东西,定义好内需承受的Intent提供联合和异步的接口

Content
Provider:是Android提供的第三方使用数据的拜访方案,能够派生Content
Provider类,对外提供数据,可以像数据库一样举办抉择排序,屏蔽内部数据的蕴藏细节,向外提供联合的假说模型,大大简化上层应用,对数码的结缘提供了更有利的路线

布罗德Cast
Receiver:接受一种或者多种Intent作触发事件,接受有关信息,做一些粗略处理,转换成一条Notification,统一了Android的风波广播模型

2、 请介绍下Android中常用的五种布局。

常用五种布局情势,分别是:FrameLayout(框架布局),LinearLayout
(线性布局),AbsoluteLayout(相对布局),RelativeLayout(相对布局),TableLayout(表格布局)。

一、FrameLayout:所有东西依次都放在左上角,会重叠,这个布局相比较简单,也只可以放一点比较简单的事物。二、LinearLayout:线性布局,每一个LinearLayout里面又可分为垂直布局(android:orientation=”vertical”)和水准布局(android:orientation=”horizontal”
)。当垂直布局时,每一行就只有一个元素,几个元素依次垂直往下;水平布局时,只有一行,每一个要素依次向右排列。三、AbsoluteLayout:绝对布局用X,Y坐标来指定元素的职务,这种布局形式也相比较简单,可是在屏幕旋转时,往往会出问题,而且四个要素的时候,总计相比较费心。四、RelativeLayout:绝对布局可以知晓为某一个因素为参照物,来恒定的布局模式。首要性能有:相对于某一个元素android:layout_below、
   
 android:layout_toLeftOf相对于父元素的地点android:layout_alignParentLeft、android:layout_alignParentRigh;五、TableLayout:表格布局,每一个TableLayout里面有报表行TableRow,TableRow里面可以切实定义每一个因素。每一个布局都有和好适合的措施,这两个布局元素得以互相嵌套应用,做出赏心悦目的界面。

3、 android中的动画有哪几类,它们的特征和界别是怎么样  

答:二种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现情势得以使视图组件移动、放大、缩短以及爆发透明度的转变;另一种Frame动画,传统的卡通方法,通过逐个的播音排列好的图片来落实,类似电影。

4、 android
中有哪三种解析xml的类?官方推荐哪一种?以及它们的规律和区分。

答:XML解析首要有两种办法,SAX、DOM、PULL。常规在PC上付出大家利用Dom相对轻松些,但有些性能敏感的数据库或手机上依旧重大行使SAX情势,SAX读取是单向的,优点:不占内存空间、解析属性方便,但缺点就是对于套嵌六个分支来说处理不是很有益。而DOM模式会把方方面面XML文件加载到内存中去,那里Android开发网提示我们该办法在查找方面能够和XPath很好的组合尽管数据量不是很大推荐使用,而PULL平日用在J2ME对于节点处理相比好,类似SAX情势,同样很节省内存,在J2ME中大家平常应用的KXML库来分析。

5、 ListView的优化方案

答:1、即使自定义适配器,那么在getView方法中要考虑方法传进来的参数contentView是否为null,如若为null就创立contentView并重临,假使不为null则直接行使。在这些艺术中尽可能少创造view。

 
2、给contentView设置tag(setTag()),传入一个viewHolder对象,用于缓存要展现的多少,可以达到图像数据异步加载的效益。

 
3、假诺listview需要出示的item很多,就要考虑分页加载。比如一共要呈现100条或者更多的时候,我们得以考虑先加载20条,等用户拉到列表底部的时候再去加载接下去的20条。

6、 请介绍下Android的数量存储情势。

答:使用SharedPreferences存储数据;文件存储数据;SQLite数据库存储数据;使用ContentProvider存储数据;网络存储数据;

Preference,File, DataBase这二种形式分别对应的目录是/data/data/Package
Name/Shared_Pref, /data/data/Package Name/files, /data/data/Package
Name/database 。

一:使用SharedPreferences存储数据

首先表明SharedPreferences存储模式,它是
Android提供的用来囤积一些大概布置消息的一种体制,例如:登录用户的用户名与密码。其拔取了Map数据结构来储存数据,以键值的法门存储,可以简单的读取与写入,具体实例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
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下。使用SharedPreferences是有些限制的:只可以在同一个包内使用,不可能在不同的包里面拔取。

二:文件存储数据

文件存储格局是一种较常用的点子,在Android中读取/写入文件的主意,与 Java中落实I/O的程序是截然一致的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。具体实例如下:

1
2
3
String fn = “moandroid.log”;
FileInputStream fis = openFileInput(fn);
FileOutputStream fos = openFileOutput(fn,Context.MODE_PRIVATE);

三:网络存储数据

网络存储形式,需要与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路径全体给登记上,如下:

1
2
3
4
5
6
//常量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方法,来操作数据。

7、activity的启航情势有怎么着?是什么含义?

答:在android里,有4种activity的启动情势,分别为: 

“standard” (默认) 

“singleTop” 

“singleTask” 

“singleInstance”

它们紧要有如下不同:

1. 什么控制所属task 

“standard”和”singleTop”的activity的靶子task,和接收的Intent的发送者在同一个task内,除非intent包括参数FLAG_ACTIVITY_NEW_TASK。 

设若提供了FLAG_ACTIVITY_NEW_TASK参数,会启动到其余task里。 

“singleTask”和”singleInstance”总是把activity作为一个task的根元素,他们不会被启动到一个任何task里。

2. 是否同意三个实例 

“standard”和”singleTop”可以被实例化多次,并且存在于不同的task中,且一个task可以概括一个activity的五个实例; 

“singleTask”和”singleInstance”则限制只生成一个实例,并且是task的根元素。 singleTop要求假设创立intent的时候栈顶已经有要开创的Activity的实例,则将intent发送给该实例,而不发送给新的实例。

3. 是否允许其他activity存在于本task内 

“singleInstance”独占一个task,此外activity不可能存在非常task里;假若它启动了一个新的activity,不管新的activity的launch mode 如何,新的activity都将会到此外task里运行(如同加了FLAG_ACTIVITY_NEW_TASK参数)。 

而此外两种形式,则足以和其他activity共存。

4. 是不是每趟都生成新实例 

“standard”对于没一个初步Intent都会变动一个activity的新实例; 

“singleTop”的activity倘若在task的栈顶的话,则不生成新的该activity的实例,直接动用栈顶的实例,否则,生成该activity的实例。 

譬如现在task栈元素为A-B-C-D(D在栈顶),这时候给D发一个起动intent,假使D是 “standard”的,则生成D的一个新实例,栈变为A-B-C-D-D。 

假诺D是singleTop的话,则不会生产D的新实例,栈状态仍为A-B-C-D 

假使此时给B发Intent的话,不管B的launchmode是”standard” 如故 “singleTop” ,都会生成B的新实例,栈状态成为A-B-C-D-B。

“singleInstance”是其所在栈的唯一activity,它会每一趟都被接纳。

“singleTask”假使在栈顶,则接受intent,否则,该intent会被撇下,然则该task仍会回去前台。

当已经存在的activity实例处理新的intent时候,会调用onNewIntent()方法 即便接到intent生成一个activity实例,那么用户可以通过back键回到上一个气象;如倘诺曾经存在的一个activity来拍卖这多少个intent的话,用户不可以透过按back键再次回到到这前边的情事。

8、跟activity和Task 有关的 Intent启动格局有什么样?其意义?

核心的Intent Flag有: 

FLAG_ACTIVITY_NEW_TASK 

FLAG_ACTIVITY_CLEAR_TOP 

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 

FLAG_ACTIVITY_SINGLE_TOP

FLAG_ACTIVITY_NEW_TASK 

  如果设置,这么些Activity会成为历史stack中一个新Task的始发。一个Task(从启动它的Activity到下一个Task中的 Activity)定义了用户可以迁移的Activity原子组。Task可以运动到前台和后台;在某个特定Task中的所有Activity总是保持同等的顺序。 

  那些标志一般用于显示“启动”类型的作为:它们提供用户一层层可以独立完成的政工,与开行它们的Activity完全无关。 

 使用那一个标志,倘诺正在起步的Activity的Task已经在运行以来,那么,新的Activity将不会启动;代替的,当前Task会简单的移入前台。参考FLAG_ACTIVITY_MULTIPLE_TASK标志,可以禁用这一作为。 

  这么些标志不可能用来调用方对曾经启动的Activity请求结果。

FLAG_ACTIVITY_CLEAR_TOP 

 
假诺设置,并且那一个Activity已经在脚下的Task中运行,因而,不再是双重起动一个以此Activity的实例,而是在这些Activity上方的所有Activity都将闭馆,然后这些Intent会作为一个新的Intent投递到老的Activity(现在位于顶端)中。 

 
例如,如若一个Task中蕴含这一个Activity:A,B,C,D。如若D调用了startActivity(),并且包含一个指向Activity
B的Intent,那么,C和D都将为止,然后B接收到这些Intent,因而,如今stack的景观是:A,B。 

  上例中正在运转的Activity
B既可以在onNewIntent()中吸收到这一个新的Intent,也能够把团结关闭然后再次起动来收取这一个Intent。假诺它的启航形式注解为
“multiple”(默认值),并且你没有在那多少个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_RESET_TASK_IF_NEEDED 

   
假如设置这个标志,这一个activity不管是从一个新的栈启动还是从已有栈推到栈顶,它都将以the
front door of the
task的艺术启动。这就讲导致其他与运用相关的栈都讲重置到正常境况(不管是正值讲activity移入依旧移除),虽然需要,或者直接重置该栈为发端状态。

FLAG_ACTIVITY_SINGLE_TOP 

  尽管设置,当这么些Activity位于历史stack的上方运行时,不再启动一个新的

FLAG_ACTIVITY_BROUGHT_TO_FRONT 

 
这么些标志一般不是由程序代码设置的,如在launchMode中安装singleTask情势时系统帮您设定。 

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_FORWARD_RESULT 

 
假诺设置,并且那个Intent用于从一个设有的Activity启动一个新的Activity,那么,这多少个作为回应目的的Activity将会传出这几个新的Activity中。这种艺术下,新的Activity可以调用setResult(int),并且这么些结果值将发送给那多少个作为回答目标的
Activity。 

FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY 

 
这些标志一般不由应用程序代码设置,即使这个Activity是从历史记录里启动的(常按HOME键),那么,系统会帮您设定。 

FLAG_ACTIVITY_MULTIPLE_TASK 

 
不要采取那些标志,除非你协调实现了应用程序启动器。与FLAG_ACTIVITY_NEW_TASK结合起来使用,可以禁用把已存的Task送入前台的作为。当设置时,新的Task总是会启动来拍卖Intent,而不管这是是否业已有一个Task可以处理相同的工作。 

 
由于默认的系统不含有图形Task管理效果,因而,你不应当采纳这一个标志,除非你提供给用户一种办法得以回来到曾经启动的Task。 

  如果FLAG_ACTIVITY_NEW_TASK标志没有设置,这些标志被忽视。 

FLAG_ACTIVITY_NO_ANIMATION 

 
假如在Intent中设置,并传递给Context.startActivity()的话,这些标志将堵住系统进入下一个Activity时使用
Acitivity迁移动画。那并不意味着动画将绝不运行——假诺另一个Activity在启动展现此前,没有点名这多少个标志,那么,动画将被拔取。那些标志可以很好的用于实施一体系的操作,而动画片被视作是更高顶尖的轩然大波的驱动。 

FLAG_ACTIVITY_NO_HISTORY 

 
假若设置,新的Activity将不再历史stack中保存。用户一离开它,这些Activity就关门了。这也足以经过设置noHistory特性。 

FLAG_ACTIVITY_NO_USER_ACTION 

 
如若设置,作为新启动的Activity进入前台时,这一个标志将在Activity暂停以前阻止从最前方的Activity回调的onUserLeaveHint()。 

 
典型的,一个Activity可以借助这些回调指显著式的用户动作引起的Activity移出后台。这一个回调在Activity的生命周期中标记一个适度的点,并关闭部分Notification。 

 
如若一个Activity通过非用户驱动的轩然大波,如来电或闹钟,启动的,这多少个标志也理应传递给Context.startActivity,保证暂停的Activity不以为用户已经知晓其Notification。 

FLAG_ACTIVITY_PREVIOUS_IS_TOP 

  If set and this intent is being used to launch a new activity from an
existing one, the current activity will not be counted as the top
activity for deciding whether the new intent should be delivered to the
top instead of starting a new one. The previous activity will be used as
the top, with the assumption being that the current activity will finish
itself immediately. 

FLAG_ACTIVITY_REORDER_TO_FRONT 

 
假如在Intent中装置,并传递给Context.startActivity(),这一个标志将掀起已经运行的Activity移动到历史stack的下边。 

 
例如,固然一个Task由五个Activity组成:A,B,C,D。假设D调用startActivity()来启动Activity
B,那么,B会活动到历史stack的顶端,现在的先后变成A,C,D,B。假若FLAG_ACTIVITY_CLEAR_TOP标志也设置的话,那么这个标志将被忽视。 

9、 请描述下Activity的生命周期。

答:activity的生命周期方法有:onCreate()、onStart()、onReStart()、onResume()、onPause()、onStop()、onDestory();

足见生命周期:从onStart()直到系统调用onStop()

前台生命周期:从onResume()直到系统调用onPause()

10、 activity在屏幕旋转时的生命周期

答:不设置Activity的android:configChanges时,切屏会重新调用各样生命周期,切横屏时会执行五回,切竖屏时会执行三回;设置Activity的android:configChanges=”orientation”时,切屏依旧会重新调用各种生命周期,切横、竖屏时只会履行五遍;设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会再也调用各种生命周期,只会执行onConfigurationChanged方法

11、 如何启用瑟维斯(Service)(Service),怎么着停用Service。

劳务的开发相比较简单,如下:

第一步:继承Service类

1
public class SMSService extends Service {}

其次步:在AndroidManifest.xml文件中的<application>节点里对劳动举办部署:<service
android:name=”.SMSService” />

劳动不可以团结运行,需要经过调用Context.startService(Service)()或Context.bind瑟维斯(Service)()方法启动服务。这三个章程都足以启动瑟维斯(Service),不过它们的采取场地有所不同。使用startService(Service)()方法启用服务,调用者与服务期间从未牵涉,即便调用者退出了,服务仍然运行。使用bindService(Service)()方法启用服务,调用者与劳动绑定在了一头,调用者一旦退出,服务也就截至,大有“不求同时生,必须同时死”的特色。

一旦打算动用Context.start瑟维斯(Service)(Service)()方法启动服务,在劳动未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。倘若调用start瑟维斯(Service)(Service)()方法前服务已经被创立,多次调用startService()方法并不会造成多次创办服务,但会造成多次调用onStart()方法。接纳startService()方法启动的劳动,只能调用Context.stopService()方法结束劳动,服务截至时会调用onDestroy()方法。

万一打算动用Context.bind瑟维斯(Service)()方法启动服务,在服务未被创立时,系统会先调用服务的onCreate()方法,接着调用onBind()方法。这些时候调用者和劳动绑定在协同,调用者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。尽管调用bindService()方法前服务一度被绑定,多次调用bindService()方法并不会导致多次成立服务及绑定(也就是说onCreate()和onBind()方法并不会被反复调用)。假若调用者希望与正在绑定的劳动解除绑定,可以调用unbind瑟维斯()方法,调用该方法也会导致系统调用服务的onUnbind()–>onDestroy()方法。 

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

onCreate()该形式在劳务被创建时调用,该方法只会被调用四次,无论调用多少次startService(Service)()或bind瑟维斯(Service)(Service)()方法,服务也只被创立一遍。

onDestroy()该方法在服务被截至时调用。

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

onStart()只有利用Context.startService()方法启动服务时才会回调该模式。该情势在劳务开始运行时被调用。多次调用startService(Service)()方法尽管不会一再开立服务,但onStart()方法会被频繁调用。

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

onBind()唯有使用Context.bind瑟维斯(Service)(Service)()方法启动服务时才会回调该办法。该办法在调用者与劳动绑定时被调用,当调用者与服务业已绑定,多次调用Context.bindService()方法并不会造成该模式被反复调用。

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

12、
注册广播有三种模式,这个措施有何优缺点?请谈谈Android引入广播机制的打算。

答:首先写一个类要继承布罗德(Broad)castReceiver

先是种:在清单文件中宣示,添加

1
2
3
4
5
<receive android:name=".IncomingSMSReceiver " >
<intent-filter>
   <action android:name="android.provider.Telephony.SMS_RECEIVED")
<intent-filter>
<receiver>

其次种接纳代码进行挂号如:

1
2
3
IntentFilter filter =  new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomgSMSReceiver();
registerReceiver(receiver.filter);

二种注册类另外界别是:

1)第一种不是常驻型广播,也就是说广播跟随程序的生命周期。

2)第三种是常驻型,也就是说当应用程序关闭后,倘诺有新闻播报来,程序也会被系统调用自动运行。

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

答:总而言之,Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再有Handler举行Message的分发和处理.

Message
Queue(音讯队列):用来存放通过Handler发表的信息,日常附属于某一个创制它的线程,可以透过Looper.myQueue()获得当前线程的音讯队列

Handler:可以发表或者处理一个音信还是操作一个Runnable,通过Handler发表音信,信息将只会发送到与它涉及的音讯队列,然也只好处理该音信队列中的新闻

Looper:是Handler和音讯队列之间通讯桥梁,程序组件首先通过Handler把音讯传递给Looper,Looper把新闻放入队列。Looper也把音信队列里的信息广播给所有的

Handler:Handler接受到信息后调用handleMessage举办处理

Message:音信的体系,在Handler类中的handleMessage方法中拿走单个的音讯举行拍卖

在单线程模型下,为了线程通信问题,Android设计了一个Message
Queue(音讯队列), 线程间能够通过该Message
Queue并构成Handler和Looper组件举办音讯置换。下边将对它们举办独家介绍:

  1. Message 

   
Message信息,精通为线程间交换的新闻,处理多少后台线程需要更新UI,则发送Message内含一些数码给UI线程。

  1. Handler 

   
Handler处理者,是Message的紧要处理者,负责Message的殡葬,Message内容的推行拍卖。后台线程就是通过传进来的
Handler对象引用来sendMessage(Message)。而利用Handler,需要implement
该类的
handleMessage(Message)方法,它是拍卖这个Message的操作内容,例如Update
UI。平常需要子类化Handler来实现handleMessage方法。

  1. Message Queue 

    Message
Queue信息队列,用来存放通过Handler发表的音讯,遵照先进先出执行。

    每个message queue都会有一个相应的Handler。Handler会向message
queue通过二种办法发送新闻:sendMessage或post。这三种新闻都会插在message
queue队尾并按先进先出执行。但透过那两种格局发送的信息执行的法门略有不同:通过sendMessage发送的是一个message对象,会被
Handler的handleMessage()函数处理;而经过post方法发送的是一个runnable对象,则会友善实施。

  1. Looper 

    Looper是每条线程里的Message Queue的管家。Android没有Global的Message
Queue,而Android会自动替主线程(UI线程)建立Message
Queue,但在子线程里并没有建立Message
Queue。所以调用Looper.getMainLooper()得到的主线程的Looper不为NULL,但调用Looper.myLooper()得到当前线程的Looper就有可能为NULL。对于子线程使用Looper,API
Doc提供了科学的使用办法:这多少个Message机制的大致流程:

    1. 在Looper.loop()方法运行起来后,循环地依照接收顺序取出Message
Queue里面的非NULL的Message。

    2. 一上马Message
Queue里面的Message都是NULL的。当Handler.sendMessage(Message)到Message
Queue,该函数里面安装了非常Message对象的target属性是近期的Handler对象。随后Looper取出了老大Message,则调用
该Message的target指向的Hander的dispatchMessage函数对Message举行拍卖。在dispatchMessage方法里,怎样处理Message则由用户指定,多少个判断,优先级从高到低:

    1)
Message里面的Callback,一个落实了Runnable接口的目标,其中run函数做拍卖工作;

    2)
Handler里面的mCallback指向的一个贯彻了Callback接口的靶子,由其handleMessage举行处理;

    3)
处理消息Handler对象对应的类继承并落实了里面handleMessage函数,通过这一个实现的handleMessage函数处理音信。

    不问可知,我们兑现的handleMessage方法是优先级最低的!

    3. Handler甩卖完该Message (update UI)
后,Looper则设置该Message为NULL,以便回收!

   
在网上有诸多小说讲述主线程和此外子线程如何互相,传送音信,最终何人来实施拍卖音讯等等的,个人精通是最简单易行的办法——判断Handler对象里面的Looper对象是属于哪条线程的,则由该线程来执行! 

    1. 当Handler对象的构造函数的参数为空,则为目前所在线程的Looper; 

2.
Looper.getMainLooper()拿到的是主线程的Looper对象,Looper.myLooper()拿到的是近日线程的Looper对象。

14、 简要分解一下activity、 intent 、intent
filter、service、布罗德case、布罗德(Broad)caseReceiver

答:一个activity显示了一个用户可以操作的可视化用户界面;一个service不分包可见的用户界面,而是在后台运行,可以与一个activity绑定,通过绑定暴露出来接口并与其进展通信;一个broadcast
receiver是一个收下播放音讯并做出回应的component,broadcast
receiver没有界面;一个intent是一个Intent对象,它保存了信息的情节。对于activity和service来说,它指定了请求的操作名称和待操作数据的URI,Intent对象可以显式的指定一个目的component。假诺这样的话,android会找到这一个component(基于manifest文件中的注解)并激活它。但假若一个目的不是显式指定的,android必须找到响应intent的最佳component。它是透过将Intent对象和目的的intent
filter相比来形成这一行事的;一个component的intent
filter告诉android该component能处理的intent。intent
filter也是在manifest文件中表明的。

15、
说说mvc格局的原理,它在android中的运用,android的合法提议应用程序的支付使用mvc形式。何谓mvc?

mvc是model,view,controller的缩写,mvc包含六个部分:

  模型(model)对象:是应用程序的大旨部分,所有的事务逻辑都应当写在该层。

  视图(view)对象:是应用程序中顶住生成用户界面的有些。也是在整整mvc架构中用户唯一可以见到的一层,接收用户的输入,展现处理结果。

  控制器(control)对象:是按照用户的输入,控制用户界面数据呈现及改进model对象情况的部分,控制器更重要的一种导航效用,响应用户出发的连带事件,交给m层处理。

  android鼓励弱耦合和组件的录取,在android中mvc的切实显示如下:

  1)视图层(view):一般接纳xml文件举办界面的描述,使用的时候可以充裕便宜的引入,当然,倘诺你对android领悟的相比较的多了话,就必定可以想到在android中也足以动用JavaScript+html等的措施作为view层,当然那里需要进行java和javascript之间的通信,幸运的是,android提供了它们中间丰硕便利的通信实现。

  2)控制层(controller):android的控制层的使命通常落在了许多的acitvity的肩上,这句话也就暗含了不用在acitivity中写代码,要通过activity交割model业务逻辑层处理,这样做的其余一个缘故是android中的acitivity的响应时间是5s,倘若耗时的操作放在此处,程序就很容易被回收掉。

  3)模型层(model):对数据库的操作、对网络等的操作都应有在model里面处理,当然对工作总括等操作也是必须放在的该层的。

16、 什么是ANR 如何制止它?

答:ANR:Application Not
Responding。在Android中,活动管理器和窗口管理器这几个系统服务承担监视应用程序的响应,当用户操作的在5s内应用程序没能做出反应,布罗德(Broad)castReceiver在10秒内没有执行完毕,就会现出应用程序无响应对话框,这既是ANR。

避免方法:Activity应该在它的要害生命周期方法(如onCreate()和onResume())里尽可能少的去做制造操作。潜在的耗时操作,例如网络或数据库操作,或者高耗时的计量如改变位图尺寸,应该在子线程里(或者异步模式)来形成。主线程应该为子线程提供一个Handler,以便形成时可以交给给主线程。

17、 什么动静会招致Force Close ?如何避免?能否捕获导致其的特别?

答:程序出现分外,比如nullpointer。

制止:编写程序时逻辑连贯,思维缜密。能捕获非凡,在logcat中能看到这么些信息

18、 描述一下android的系统架构

android系统架构分从下往上为linux
内核层、运行库、应用程序框架层、和采纳程序层。

linuxkernel:负责硬件的驱动程序、网络、电源、系统安全以及内存管理等功能。

libraries和 android
runtime:libraries:即c/c++函数库部分,大多数都是开放源代码的函数库,例如webkit(引擎),该函数库负责
android网页浏览器的运行,例如标准的c函数库libc、openssl、sqlite等,当然也席卷补助游戏开发2dsgl和
3dopengles,在多媒体方面有mediaframework框架来辅助各样影音和图形文件的广播与显示,例如mpeg4、h.264、mp4、
aac、amr、jpg和png等居多的多媒体文件格式。android的runtime负责解释和实践生成的dalvik格式的字节码。

 applicationframework(应用软件架构),java应用程序开发人士首假如接纳该层封装好的api举行快捷支付。

  applications:该层是java的采纳程序层,android内置的googlemaps、e-mail、即时通信工具、浏览器、mp4播放器等处于该层,java开发人士开发的顺序也处在该层,而且和停放的应用程序具有同样的岗位,可以调用内置的应用程序,也足以替换内置的应用程序。

  下面的三个层次,下层为上层服务,上层需要下层的扶助,调用下层的劳务,这种严苛分层的章程带来的高大的安定团结、灵活性和可扩张性,使得不同层的开发人士可以依照专业专心特定层的支出。

android应用程序使用框架的api并在框架下运作,这就带来了先后开发的惊人一致性,另一方面也报告咱们,要想写出优质便捷的顺序就不可以不对任何
applicationframework举行特别深远的精通。了解applicationframework,你就足以真正的了然android的筹划和运行机制,也就更可以驾驶整个应用层的支付。

19、 请介绍下ContentProvider是怎样促成数量共享的。

一个顺序可以经过兑现一个Content
provider的肤浅接口将自己的数额完全透暴露来,而且Content
providers是以近乎数据库中表的章程将数据流露。Content
providers存储和寻找数据,通过它能够让具有的应用程序访问到,这也是应用程序之间唯一共享数据的不二法门。

要想使应用程序的多少公开化,可透过2种模式:成立一个属于您自己的Content
provider或者将你的数据增长到一个已经存在的Content
provider中,前提是有一致数据类型并且有写入Content provider的权能。

咋样通过一套标准及联合的接口获取另外应用程序显露的多少?

Android提供了ContentResolver,外界的次第可以通过ContentResolver接口访问ContentProvider提供的数量。

20、 Service和Thread的区别?

答:servie是系统的零件,它由系统经过托管(servicemanager);它们中间的通信类似于client和server,是一种轻量级的ipc通信,这种通信的载体是binder,它是在linux层沟通信息的一种ipc。而thread是由本应用程序托管。1).
Thread:Thread 是程序执行的细微单元,它是分配CPU的焦点单位。可以用
Thread 来施行一些异步的操作。

2). Service:Service 是android的一种体制,当它运行的时候要是是Local
瑟维斯(Service),那么相应的 瑟维斯(Service)(Service) 是运行在主进程的 main
线程上的。如:onCreate,onStart 这多少个函数在被系统调用的时候都是在主进程的
main 线程上运行的。淌如果Remote Service,那么相应的 Service则是运作在单身进程的 main 线程上。

既然如此这样,那么大家为啥要用 瑟维斯(Service) 呢?其实这跟 android
的系统编制有关,我们先拿 Thread 来说。Thread 的运作是独立于 Activity
的,也就是说当一个 Activity 被 finish 之后,假使您没有积极停止 Thread
或者 Thread 里的 run 方法没有举办完毕的话,Thread
也会平昔推行。由此这里会油但是生一个题材:当 Activity 被 finish
之后,你不再抱有该 Thread 的引用。另一方面,你未曾艺术在不同的 Activity
中对同一 Thread 举行支配。  

举个例子:倘使您的 Thread
需要不停地隔一段时间就要连续服务器做某种同步的话,该 Thread 需要在
Activity 没有start的时候也在运作。这多少个时候当您 start 一个 Activity
就没有章程在该 Activity 里面控制在此之前创设的
Thread。因此你便需要创立并启动一个 Service ,在 Service(Service)里面创设、运行并操纵该 Thread,那样便解决了该问题(因为另外 Activity
都得以控制同一 Service,而系统也只会创设一个遥相呼应 瑟维斯(Service)(Service) 的实例)。  

因而你可以把 Service 想象成一种音讯服务,而你可以在其他有 Context
的地方调用
Context.startService、Context.stopService、Context.bindService(Service),Context.unbindService(Service),来决定它,你也得以在
瑟维斯(Service) 里登记 布罗德(Broad)castReceiver,在其它地点通过发送 broadcast
来支配它,当然这么些都是 Thread 做不到的。

21、
Android本身的api并未讲明会抛出非常,则其在运作时有无可能抛出runtime相当,你遇到过吧?诺有的话会造成什么样问题?咋样解决?

答:会,比如nullpointerException。我遇上过,比如textview.setText()时,textview没有起始化。会导致程序不可能正常运作出现forceclose。打开控制台查看logcat信息找出特别音讯并修改程序。

22、 Intent瑟维斯(Service)(Service)有何优点?

答:Acitivity的过程,当处理Intent的时候,会发生一个遥相呼应的Service(Service);
Android的经过处理器现在会尽可能的不kill掉你;非凡容易使用

23、
假如后台的Activity由于某原因被系统回收了,咋样在被系统回收往日封存当前场馆?

答:重写onSaveInstanceState()方法,在此方法中保留需要保留的多寡,该办法将会在activity被回收往日调用。通过重写onRestoreInstanceState()方法可以从中提取保存好的数量

24、 怎么着将一个Activity设置成窗口的体裁。

答:<activity>中配置:android
:theme=”@android:style/Theme.Dialog” 

其它android:theme=”@android:style/Theme.Translucent” 是安装透明

25、 如何退出Activity?怎么样安全退出已调用三个Activity的Application?

答:对于单一Activity的应用来说,退出很粗略,直接finish()即可。当然,也可以用killProcess()和System.exit()这样的法门。

对此四个activity,1、记录打开的Activity:每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。2、发送特定广播:在需要收尾应用时,发送一个特定的播音,每个Activity收到广播后,关闭即可。3、递归退出:在打开新的Activity时利用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。为了编程方便,最好定义一个Activity基类,处理那么些共通问题。

在2.1往日,能够运用ActivityManager的restartPackage方法。

它可以间接截至所有应用。在动用时索要权限android.permission.RESTART_PACKAGES。

注意不要被它的名字迷惑。

不过,在2.2,这个点子失效了。在2.2添加了一个新的艺术,killBackground
Processes(),需要权限
android.permission.KILL_BACKGROUND_PROCESSES。可惜的是,它和2.2的restartPackage一样,根本起不到相应的效劳。

此外还有一个艺术,就是系统自带的应用程序管理里,强制截止程序的主意,forceStopPackage()。它需要权限android.permission.FORCE_STOP_PACKAGES。并且需要添加android:sharedUserId=”android.uid.system”属性。同样可惜的是,该方法是非公开的,他只得运行在系统经过,第三方先后无法调用。

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

而Android.mk是用于在Android源码下编译程序用的。

从上述方可寓目,在2.2,没有办法间接截至一个行使,而不得不用自己的措施直接办到。

现提供多少个方法,供参考:

1、抛分外强制退出:

该措施通过抛分外,使程序Force Close。

表达可以,可是,需要缓解的题材是,如何使程序停止掉,而不弹出Force
Close的窗口。

2、记录打开的Activity:

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

3、发送特定广播:

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

4、递归退出

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

除去第一个,都是想艺术把每一个Activity都得了掉,直接达到目标。不过这样做相同不圆满。你会发现,假使自己的应用程序对每一个Activity都安装了nosensor,在三个Activity结束的间隙,sensor可能使得了。但至少,大家的目标达到了,而且从不影响用户接纳。为了编程方便,最好定义一个Activity基类,处理这么些共通问题。

26、 AIDL的齐全是咋样?如何工作?能处理哪些类型的数据?

答:全称是:Android Interface Define Language

在Android中, 每个应用程序都得以有温馨的进程. 在写UI应用的时候,
平常要用到瑟维斯(Service). 在不同的经过中, 怎么样传递对象呢?显著,
Java中不允许跨进程内存共享. 由此传递对象,
只好把目的拆分成操作系统能了然的简单款式, 以高达跨界对象访问的目的.
在J2EE中,采用RMI的办法, 能够通过序列化传递对象. 在Android中,
则拔取AIDL的形式. 理论上AIDL可以传递Bundle,实际上做起来却相比较麻烦。

AIDL(AndRoid接口描述语言)是一种借口描述语言;
编译器可以经过aidl文件生成一段代码,通过先行定义的接口达到六个过程之中通信进程的目的.
若是急需在一个Activity中, 访问另一个瑟维斯(Service)(Service)中的某个对象,
需要先将对象转化成AIDL可识其余参数(可能是三个参数),
然后使用AIDL来传递这一个参数, 在信息的接收端,
使用这多少个参数组装成自己索要的对象.

AIDL的IPC的体制和COM或CORBA类似,
是依据接口的,但它是轻量级的。它采纳代理类在客户端和落实层间传递值.
如果要拔取AIDL, 需要做到2件事务: 1. 引入AIDL的相关类.; 2.
调用aidl爆发的class.

AIDL的创始方法:

AIDL语法很粗略,可以用来声称一个带一个或七个措施的接口,也得以传递参数和再次回到值。
由于长途调用的内需,
这多少个参数和重临值并不是其它类型.上面是些AIDL辅助的数据类型:

  1. 不需要import阐明的简要Java编程语言类型(int,boolean等)

  2. String, CharSequence不需要新鲜阐明

  3. List, Map和Parcelables类型,
    这么些项目内所含有的数码成员也不得不是粗略数据类型,
    String等其它比辅助的类型.

(另外: 我没尝试Parcelables, 在Eclipse+ADT下编译然则, 或许将来会拥有补助)

27、 请解释下Android程序运行时权限与文件系统权限的界别。

答:运行时权限Dalvik( android授权) 

文件系统 linux 内核授权

28、
系统上设置了多种浏览器,能否指定某浏览器访问指定页面?请表达原委。

经过一贯发送Uri把参数带过去,或者通过manifest里的intentfilter里的data属性

29、 android系统的优势和不足

答:Android平台手机 5大优势: 

一、开放性 

在优势方面,Android平台首先就是其开发性,开发的阳台允许其他活动终端厂商投入到Android联盟中来。显然的开放性可以使其抱有更多的开发者,随着用户和行使的日趋增长,一个簇新的阳台也将高速走向成熟。开放性对于Android的向上而言,有利于积累人气,这里的人气席卷消费者和厂商,而对此消费者来讲,随大的收益正是丰富的软件资源。开放的阳台也会带来更大竞争,如此一来,消费者将得以用更低的价格购得心仪的无绳电话机。

二、挣脱运营商的束缚 

在过去很长的一段时间,特别是在欧美地区,手机采取往往面临运营商制约,使用什么效用衔接什么网络,几乎都面临运营商的支配。从上年小米上市
,用户可以更进一步便民地连续网络,运营商的牵制缩短。随着EDGE、HSDPA这个2G至3G移动网络的日益对接和擢升,手机随机接入网络已不是运营商口中的笑谈,当你可以透过手机IM软件方便地拓展当下聊天时,再记念不久前几天价的彩信和图铃下载业务,是不是像梦魇一样?互联网巨头Google推动的Android终端天生就有网络特色,将让用户离互联网更近。

三、充足的硬件选取 

这或多或少要么与Android平台的开放性相关,由于Android的开放性,众多的厂商会推出千奇百怪,功效特色各具的多种产品。功效上的区别和特色,却不会潜移默化到多少同步、甚至软件的匹配,好比你从三星Symbian风格手机 一下改用苹果 OPPO,同时还可将Symbian中完美的软件带到BlackBerry上接纳、联系人等材料更加可以方便地更换,是不是特别便于啊?

四、不受任何限制的支出商 

Android平台提供给第三方开发商一个异常广泛、自由的条件,不会受到各个条条框框的阻扰,不言而喻,会有些许新颖别致的软件会诞生。但也有其两面性,血腥、暴力、情色方面的顺序和玩耍如可决定正是留给Android难题之一。

五、无缝结合的Google应用 

明天叱诧互联网的Google已经渡过10年度历史,从查找巨人到健全的互联网渗透,Google服务如地图、邮件、搜索等已经成为连年用户和互联网的最重要问题,而Android平台手机将无缝结合这个美观的Google服务。

再说Android的5大不足:

一、安全和隐私 

由于手机
与互联网的紧密联系,个人隐私很难拿到保守。除了上网过程中注意或不在意留下的私房足迹,Google这多少个大个子也天天站在您的身后,洞穿任何,由此,互联网的深透将会带来新一轮的心曲危机。

二、首先开卖Android手机的不是最流年营商 

总而言之,T-Mobile在23日,于美利坚联邦合众国伦敦发布了Android首款手机G1。然而在北美市场,最大的两家营业商乃AT&T和Verizon,而当前所知取得Android手机销售权的仅有
T-Mobile和Sprint,其中T-Mobile的3G网络相对于其他三家也要没有不少,由此,用户可以买账购买G1,能否体验到最佳的3G网络服务则要另当别论了!

三、运营商仍可以够影响到Android手机 

在国内市场,不少用户对采购移动定制机不满,感觉所购的手机被人涂画了广告一般。这样的气象在国外市场同样出现。Android手机的另一贩卖运营商Sprint就将在其机型中放置其手机集团程序。

四、同类机型用户缩小 

在不少无线电话论坛都会有指向某一型号的子论坛,对一款手机的行使体验互换,并享受软件资源。而对于Android平台手机,由于厂商充分,产品档次多样,这样使用同一款机型的用户越来越少,缺乏统一机型的次第强化。举个稍显不当的例证,现在山寨机泛滥,品种不同,就很少有特意针对某个型号山寨机的研讨和群组,除了哪些效用极度抢眼、颇受追捧的机型以外。

五、过分依赖开发商贫乏标准配置 

在行使PC端的Windows Xp系统的时候,都会停放微软Windows Media
Player这样一个浏览器先后,用户可以挑选更不知凡几的播放器,如Realplay或暴风影音等。但动手初步运用默认的先后一样可以应付多样的内需。在
Android平台中,由于其开放性,软件更多依赖第三方厂商,比如Android系统的SDK中就不曾放手音乐
播放器,全部依靠第三方支付,缺乏了产品的统一性。

30、 Android dvm的长河和Linux的长河, 应用程序的过程是否为同一个定义 

答:DVM指dalivk的虚拟机。每一个Android应用程序都在它和谐的过程中运行,都具有一个单独的Dalvik虚拟机实例。而每一个DVM都是在Linux
中的一个过程,所以说可以认为是同一个概念。

31、 sim卡的EF文件是怎样?有何意义

答:sim卡的文件系统有谈得来专业,紧倘诺为了和手机通讯,sim本
身可以有友好的操作系统,EF就是作存储并和手机通讯用的

32、 嵌入式操作系统内存管理有哪二种, 各有何特征

  页式,段式,段页,用到了MMU,虚拟空间等技能

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

嵌入式实时操作系统是指当外界事件或数量爆发时,可以承受并以充分快的快慢予以处理,其拍卖的结果又能在规定的年华之内来支配生产过程或对拍卖系统作出急迅响应,并操纵所有实时任务协调一致运行的嵌入式操作系统。紧要用于工业控制、
军事装备、
航空航天等世界对系统的响应时间有苛刻的要求,这就需要运用实时系统。又可分为软实时和矫健时二种,而android是基于linux内核的,因而属于软实时。

34、 一条最长的短新闻约占多少byte?

  国语70(包括标点),英文160,160个字节。  

35、 咋样将SQLite数据库(dictionary.db文件)与apk文件一起发表

解答:能够将dictionary.db文件复制到Eclipse Android工程中的res
aw目录中。所有在res
aw目录中的文件不会被减去,这样可以直接领取该目录中的文件。可以将dictionary.db文件复制到res
aw目录中

36、 如何将开辟res aw目录中的数据库文件?

766游戏网官网,解答:在Android中不可能一直打开res
aw目录中的数据库文件,而需要在程序第一次启动时将该公文复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。

复制的骨干方法是运用getResources().openRawResource方法得到res
aw目录中资源的
InputStream对象,然后将该InputStream对象中的数据写入另外的目录中相应文件中。在Android
SDK中得以使用SQLiteDatabase.openOrCreateDatabase方法来开辟任意目录中的SQLite数据库文件。

37、 DDMS和TraceView的区别? 

DDMS是一个程序执行查看器,在里面可以瞥见线程和库房等音讯,TraceView是先后性能分析器

38、 java中哪些引用本地语言 

可以用JNI(java native interface  java 本地接口)接口 。

39、 谈谈Android的IPC(进程间通信)机制 

IPC是中间进程通信的简称,
是共享”命名管道”的资源。Android中的IPC机制是为着让Activity和Service(Service)之间可以每天的举行交互,故在Android中该机制,只适用于Activity和Service之间的通信,类似于远程方法调用,类似于C/S格局的造访。通过定义AIDL接口文件来定义IPC接口。Servier端实现IPC接口,Client端调用IPC接口本地代理。

40、 NDK是什么

NDK是局部列工具的联谊,NDK提供了一文山会海的工具,帮忙开发者快速的开销C/C++的动态库,并能自动将so和java
应用打成apk包。

NDK集成了接力编译器,并提供了相应的mk文件和隔离cpu、平台等的差距,开发人员只需简单的改动mk文件就足以创制出so

发表评论

电子邮件地址不会被公开。 必填项已用*标注