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

Android笔试面试题三(易考问答)

2016-10-02 17:09 281 查看
1.Android本身的api并未声明会抛出异常,则其在运行时有无可能抛出runtime异常,你遇到过吗?诺有的话会导致什么问题?如何解决?




2.IntentService有何优点?
IntentService 的好处 :1)Acitivity的进程,当处理Intent的时候,会产生一个对应的Service; 

         2)Android的进程处理器现在会尽可能的不kill掉你 ;

         3)非常容易使用;
3.如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
onSaveInstanceState()

当你的程序中某一个Activity A在运行时,主动或被动地运行另一个新的Activity B,这个时候A会执行onSaveInstanceState()。B完成以后又会来找A,这个时候就有两种情况:一是A被回收,二是A没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上了参数savedInstanceState;而没被收回的就直接执行onResume(),跳过onCreate()了。
4.如何将一个Activity设置成窗口的样式
在AndroidManifest.xml 中定义Activity的地方一句话(XML代码):
1)android:theme="@android:style/Theme.Dialog";使应用程序变成对话框的形式弹出来了
2)android:theme="@android:style/Theme.Translucent";就变成半透明的
5.如何退出Activity?如何安全退出已调用多个Activity的Application?
对于单一Activity:直接finish(),或者使用killProcess()及System.exit(0)
对于多个Activity:



6.AIDL的全称是什么?如何工作?能处理哪些类型的数据?
AIDL的英文全称是Android Interface Define Language
当A进程要去调用B进程中的service时,并实现通信,我们通常都是通过AIDL来操作的
A工程:

首先我们在net.blogjava.mobile.aidlservice包中创建一个RemoteService.aidl文件,在里面我们自定义一个接口,含有方法get。ADT插件会在gen目录下自动生成一个RemoteService.java文件,该类中含有一个名为RemoteService.stub的内部类,该内部类中含有aidl文件接口的get方法。

说明一:aidl文件的位置不固定,可以任意

然后定义自己的MyService类,在MyService类中自定义一个内部类去继承RemoteService.stub这个内部类,实现get方法。在onBind方法中返回这个内部类的对象,系统会自动将这个对象封装成IBinder对象,传递给他的调用者。

其次需要在AndroidManifest.xml文件中配置MyService类,代码如下:

<!-- 注册服务 --> 

<service android:name=".MyService"> 

  <intent-filter> 

   <!--  指定调用AIDL服务的ID  --> 

       <actionandroid:name="net.blogjava.mobile.aidlservice.RemoteService"/> 

   </intent-filter> 

</service>

为什么要指定调用AIDL服务的ID,就是要告诉外界MyService这个类能够被别的进程访问,只要别的进程知道这个ID,正是有了这个ID,B工程才能找到A工程实现通信。

说明:AIDL并不需要权限
B工程:

      首先我们要将A工程中生成的RemoteService.java文件拷贝到B工程中,在bindService方法中绑定aidl服务

      绑定AIDL服务就是将RemoteService的ID作为intent的action参数。

      说明:如果我们单独将RemoteService.aidl文件放在一个包里,那个在我们将gen目录下的该包拷贝到B工程中。如果我们将RemoteService.aidl文件和我们的其他类存放在一起,那么我们在B工程中就要建立相应的包,以保证RmoteService.java文件的报名正确,我们不能修改RemoteService.java文件

          bindService(newInten("net.blogjava.mobile.aidlservice.RemoteService"),serviceConnection,Context.BIND_AUTO_CREATE); 

      ServiceConnection的onServiceConnected(ComponentName name, IBinderservice)方法中的service参数就是A工程中MyService类中继承了RemoteService.stub类的内部类的对象。
7.请解释下Android程序运行时权限与文件系统权限的区别
运行时权限Dalvik( android授权) 
文件系统 linux 内核授权
8.系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由
通过直接发送Uri把参数带过去,或者通过manifest里的intentfilter里的data属性
9.Androiddvm的进程和Linux的进程,应用程序的进程是否为同一个概念
DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念
10.你如何评价Android系统?优缺点。
Android平台手机 5大优势: 

一、开放性


在优势方面,Android平台首先就是其开发性,开发的平台允许任何移动终端厂商加入到Android联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟。

开放性对于Android的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来讲,随大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机。
二、挣脱运营商的束缚

在过去很长的一段时间,特别是在欧美地区,手机应用往往受到运营商制约,使用什么功能接入什么网络,几乎都受到运营商的控制。从去年iPhone 上市 ,用户可以更加方便地连接网络,运营商的制约减少。随着EDGE、HSDPA这些2G至3G移动网络的逐步过渡和提升,手机随意接入网络已不是运营商口中的笑谈,当你可以通过手机IM软件方便地进行即时聊天时,再回想不久前天价的彩信和图铃下载业务,是不是像噩梦一样?互联网巨头Google推动的Android终端天生就有网络特色,将让用户离互联网更近。
三、丰富的硬件选择

这一点还是与Android平台的开放性相关,由于Android的开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品。功能上的差异和特色,却不会影响到数据同步、甚至软件的兼容,好比你从诺基亚 Symbian风格手机 一下改用苹果 iPhone ,同时还可将Symbian中优秀的软件带到iPhone上使用、联系人等资料更是可以方便地转移,是不是非常方便呢?
四、不受任何限制的开发商 

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中就没有内置音乐 播放器,全部依赖第三方开发,缺少了产品的统一性。
11.一条最长的短信息约占多少byte?
中文70(包括标点),英文160个字节
12.sim卡的EF 文件有何作用
sim卡的文件系统有自己规范,主要是为了和手机通讯,sim本 身可以有自己的操作系统,EF就是作存储并和手机通讯用的
13.嵌入式操作系统内存管理有哪几种, 各有何特性
页式,段式,段页,用到了MMU,虚拟空间等技术
14.什么是嵌入式实时操作系统,Android 操作系统属于实时操作系统吗?
嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。主要用于工业控制、 军事设备、 航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。又可分为软实时和硬实时两种,而android是基于linux内核的,因此属于软实时。
15.如何将打开resaw目录中的数据库文件?
在Android中不能直接打开res aw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得res aw目录中资源的 InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。
16.如何将SQLite数据库(dictionary.db文件)与apk文件一起发布?
可以将dictionary.db文件复制到Eclipse Android工程中的res aw目录中。所有在res aw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。可以将dictionary.db文件复制到res aw目录中
17.DDMS和TraceView的区别?
DDMS是一个程序执行查看器,在里面可以看见线程和堆栈等信息,TraceView是程序性能分析器 。
18.java中如何引用本地语言(C语言程序)
可以用JNI(java nativeinterface  java 本地接口)接口
19.谈谈Android的IPC(进程间通信)机制
IPC是内部进程通信的简称, 是共享"命名管道"的资源。Android中的IPC机制是为了让Activity和Service之间可以随时的进行交互,故在Android中该机制,只适用于Activity和Service之间的通信,类似于远程方法调用,类似于C/S模式的访问。通过定义AIDL接口文件来定义IPC接口。Servier端实现IPC接口,Client端调用IPC接口本地代理。
20.谈谈你对Android NDK的理解
一、前言

 6月 26 日, Google Android 发布了 NDK ,引起了很多发人员的兴趣。 NDK 全称: Native Development Kit。

二、误解

新出生的事物,除了惊喜外,也会给我们带来一定的迷惑、误解。
1)误解一: NDK 发布之前, Android 不支持进行 C 开发

 在Google 中搜索 “NDK” ,很多 “Android 终于可以使用 C++ 开发 ” 之类的标题,这是一种对 Android 平台编程方式的误解。其实, Android 平台从诞生起,就已经支持 C 、 C++ 开发。众所周知, Android 的 SDK 基于 Java 实现,这意味着基于 Android SDK 进行开发的第三方应用都必须使用 Java 语言。但这并不等同于 “ 第三方应用只能使用 Java” 。在 Android SDK 首次发布时, Google 就宣称其虚拟机 Dalvik
支持 JNI 编程方式,也就是第三方应用完全可以通过 JNI 调用自己的 C 动态库,即在 Android 平台上, “Java+C” 的编程方式是一直都可以实现的。

 当然这种误解的产生是有根源的:在AndroidSDK 文档里,找不到任何 JNI 方面的帮助。即使第三方应用开发者使用 JNI 完成了自己的 C 动态链接库( so )开发,但是 so 如何和应用程序一起打包成 apk 并发布?这里面也存在技术障碍。我曾经花了不少时间,安装交叉编译器创建 so ,并通过 asset (资源)方式,实现捆绑 so 发布。但这种方式只能属于取巧的方式,并非官方支持。所以,在 NDK 出来之前,我们将 “Java+C” 的开发模式称之为灰色模式,即官方既不声明 “ 支持这种方式
” ,也不声明 “ 不支持这种方式 ” 。
2)误解二:有了 NDK ,我们可以使用纯 C 开发 Android 应用

 Android SDK采用 Java 语言发布,把众多的 C 开发人员排除在第三方应用开发外( 注意:我们所有讨论都是基于“ 第三方应用开发 ” , Android 系统基于 Linux ,系统级别的开发肯定是支持 C 语言的。 )。NDK 的发布,许多人会误以为,类似于 Symbian 、 WM ,在 Android 平台上终于可以使用纯 C 、 C++ 开发第三方应用了!其实不然, NDK 文档明确说明: it is not a good way 。因为 NDK 并没有提供各种系统事件处理支持,也没有提供应用程序生命周期维护。此外,在本次发布的
NDK 中,应用程序 UI 方面的 API 也没有提供。至少目前来说,使用纯 C 、 C++ 开发一个完整应用的条件还不完备。

三、NDK 是什么

1)NDK是一些列工具的集合


NDK提供了一系列的工具,帮助开发者快速开发 C (或 C++ )的动态库,并能自动将 so 和 java 应用一起打包成 apk 。这些工具对开发者的帮助是巨大的。

NDK集成了交叉编译器,并提供了相应的 mk 文件隔离 CPU 、平台、 ABI 等差异,开发人员只需要简单修改 mk 文件(指出 “ 哪些文件需要编译 ” 、 “ 编译特性要求 ” 等),就可以创建出 so 。 

NDK可以自动地将 so 和 Java 应用一起打包,极大地减轻了开发人员的打包工作。
2)NDK 提供了一份稳定、功能有限的 API 头文件声明

 Google明确声明该 API 是稳定的,在后续所有版本中都稳定支持当前发布的 API 。从该版本的 NDK 中看出,这些 API 支持的功能非常有限,包含有:C 标准库( libc )、标准数学库( libm )、压缩库( libz )、 Log 库( liblog )。

四、NDK 带来什么

1)NDK 的发布,使 “Java+C” 的开发方式终于转正,成为官方支持的开发方式


使用NDK ,我们可以将要求高性能的应用逻辑使用 C 开发,从而提高应用程序的执行效率。 

使用NDK ,我们可以将需要保密的应用逻辑使用 C 开发。毕竟, Java 包都是可以反编译的。 

NDK促使专业 so 组件商的出现。(乐观猜想,要视乎 Android 用户的数量) 
2、NDK 将是 Android 平台支持 C 开发的开端

 NDK提供了的开发工具集合,使开发人员可以便捷地开发、发布 C 组件。同时, Google承诺在 NDK 后续版本中提高 “ 可调式 ” 能力,即提供远程的 gdb 工具,使我们可以便捷地调试 C 源码。在支持 Android 平台 C 开发,我们能感觉到 Google 花费了很大精力,我们有理由憧憬 “C 组件支持 ” 只是 Google Android 平台上C 开发的开端。毕竟, C 程序员仍然是码农阵营中的绝对主力,将这部分人排除在 Android 应用开发之外,显然是不利于 Android 平台繁荣昌盛的。
21.android中线程与线程,进程与进程之间如何通信






23.View,surfaceView,GLSurfaceView有什么区别
Android游戏当中主要的除了控制类外就是显示类View。SurfaceView是从View基类中派生出来的显示类。android游戏开发中常用的三种视图是:view、SurfaceView和GLSurfaceView。

View:显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等;必须在UI主线程内更新画面,速度较慢

SurfaceView:基于view视图进行拓展的视图类,更适合2D游戏的开发;是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快

GLSurfaceView:基于SurfaceView视图再次进行拓展的视图类,专用于3D游戏开发的视图;是SurfaceView的子类,openGL专用。

在2D游戏开发中,大致可以分为两种游戏框架,View和SurfaceView。 

View和SurfaceView区别:

View:必须在UI的主线程中更新画面,用于被动更新画面。

surfaceView:UI线程和子线程中都可以。在一个新启动的线程中重新绘制画面,主动更新画面。

UI的主线程中更新画面 可能会引发问题,比如你更新画面的时间过长,那么你的主UI线程会被你正在画的函数阻塞。那么将无法响应按键,触屏等消息。

当使用surfaceView 由于是在新的线程中更新画面所以不会阻塞你的UI主线程。但这也带来了另外一个问题,就是事件同步,涉及到线程同步。

所以基于以上,根据游戏特点,一般分成两类。

1 被动更新画面的。比如棋类,这种用view就好了。因为画面的更新是依赖于 onTouch 来更新,可以直接使用 invalidate。 因为这种情况下,这一次Touch和下一次的Touch需要的时间比较长些,不会产生影响。 

2 主动更新。比如一个人在一直跑动。这就需要一个单独的thread不停的重绘人的状态,避免阻塞main UI thread。所以显然view不合适,需要surfaceView来控制。 

24.Adapter有什么作用?常见的Adapter有哪些?



25.Manifest.xml文件里主要包含了哪些信息?



26.根据自己的理解描述下Android数字签名。



27. handler机制的原理
Andriod提供了 Handler 和 Looper 来满足线程间的通信。Handler 先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。 

  1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。 

  2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息。 

  3)Message Queue(消息队列):用来存放线程放入的消息。 

  4)线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。
28.View如何刷新
View 可以调用invalidate()和postInvalidate()这两个方法刷新
29.Service的生命周期
有两种方法启动一个Service,他们对Service生命周期的影响不一样:
1.通过startService():方法的调用

Intent intent =new Intent(DemoActivity.this,DemoService.class);

startService(intent);
创建Service会经历onCreate()-->onStart();

多次调用startService()方法尽管不会多次创建服务(onCreate()),但onStart() 方法会被多次调用;

stopService的时候直接onDestroy();

调用者和服务之间没有联系,如果调用者直接退出而没有stopService的话,Service会一直在后台运行。
【onCreate()-->onStartCommand()-->startService()-->onDestroy()】(推荐使用onStartCommand()方法取代onStart()方法)

2.通过bindService()启动:绑定服务

Intent intent =new Intent(DemoActivity.this, DemoService.class);

bindService(intent, conn, Context.BIND_AUTO_CREATE);

//unbindService(conn);//解除绑定
创建Service只会运行onCreate();

接着onBind()方法将调用者与服务进行绑定;当调用者与服务已经绑定,多次调用bindService()方法并不会导致该方法被多次调用。

调用者与服务绑定在一起,调用者一旦退出,服务也就终止,两者共存亡
【onCreate()-->onBind()-->onUnbind()-->onDestroy()】
30.Android中Activity,Intent,Content Provider,Service各有什么区别



31.双缓冲技术原理以及优缺点



32.AsyncTask





1.AsyncTask和Handler对比
1 )AsyncTask实现的原理,和适用的优缺点
AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.
使用的优点:1>简单,快捷;2>过程可控
使用的缺点:在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来;
2)Handler异步实现的原理和适用的优缺点
在Handler 异步实现时,涉及到 Handler, Looper, Message,Thread四个对象,实现异步的流程是主线程启动Thread(子线程)àthread(子线程)运行并生成Message-àLooper获取Message并传递给HandleràHandler逐个获取Looper中的Message,并进行UI变更。
使用的优点:1>结构清晰,功能定义明确;2>对于多个后台任务时,简单,清晰
使用的缺点:在单个后台异步处理时,显得代码过多,结构过于复杂(相对性)

2.AsyncTask介绍

Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理。

首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的。
Android为了降低这个开发难度,提供了AsyncTask。AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务。
AsyncTask直接继承于Object类,位置为android.os.AsyncTask。要使用AsyncTask工作我们要提供三个泛型参数,并重载几个方法(至少重载一个)。
AsyncTask定义了三种泛型类型 Params,Progress和Result。

Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String。

一个异步加载数据最少要重写以下这两个方法:
doInBackground(Params…) :后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
onPostExecute(Result) :相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回
有必要的话你还得重写以下这三个方法,但不是必须的:
onProgressUpdate(Progress…):可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。
onPreExecute():这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。
onCancelled():用户调用取消时,要做的操作
使用AsyncTask类,以下是几条必须遵守的准则:
Task的实例必须在UI thread中创建;
execute方法必须在UI thread中调用;
不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...),onProgressUpdate(Progress...)这几个方法;
该task只能被执行一次,否则多次调用时将会出现异常;

33.Socket通信

1、Socket通信的步骤

  ① 创建ServerSocket和Socket

  ② 打开连接到Socket的输入/输出流

  ③ 按照协议对Socket进行读/写操作

  ④ 关闭输入输出流、关闭Socket

2、服务器端:

  ① 创建ServerSocket对象,绑定监听端口

  ② 通过accept()方法监听客户端请求

  ③ 连接建立后,通过输入流读取客户端发送的请求信息

  ④ 通过输出流向客户端发送乡音信息

  ⑤ 关闭相关资源

3、客户端:

  ① 创建Socket对象,指明需要连接的服务器的IP地址和端口号

  ② 连接建立后,通过输出流想服务器端发送请求信息

  ③ 通过输入流获取服务器响应的信息

  ④ 关闭响应资源 

4、应用多线程实现服务器与多客户端之间的通信

  ① 服务器端创建ServerSocket,循环调用accept()等待客户端连接

  ② 客户端创建一个socket并请求和服务器端连接

  ③ 服务器端接受苦读段请求,创建socket与该客户建立专线连接

  ④ 建立连接的两个socket在一个单独的线程上对话

  ⑤ 服务器端继续等待新的连接

34.[b]页面上现有ProgressBar控件progressBar,请用书写线程以10秒的的时间完成其进度显示工作。[/b]

public class ProgressBarStu extends Activity {
private ProgressBar progressBar = null;
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.progressbar);
//从这到下是关键
progressBar = (ProgressBar)findViewById(R.id.progressBar);
Thread thread = new Thread(newRunnable() {
@Override
public void run() {
int progressBarMax =progressBar.getMax();
try {
while(progressBarMax!=progressBar.getProgress())
{
intstepProgress = progressBarMax/10;
intcurrentprogress = progressBar.getProgress();
progressBar.setProgress(currentprogress+stepProgress);
Thread.sleep(1000);
}
} catch(InterruptedException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
}
});
thread.start();
//关键结束
}
}


35.[b]请继承SQLiteOpenHelper实现:[/b]
   1).创建一个版本为1的“diaryOpenHelper.db”的[b]数据库

   2).同时创建一个 “diary” 表(包含一个_id主键并自增长,topic字符型100

          长度, content字符型1000长度)

   3).在数据库版本变化时请删除diary表,并重新创建出diary表。[/b]

public class DBHelper extends SQLiteOpenHelper{
public final static String DATABASENAME ="diaryOpenHelper.db";
public final static int DATABASEVERSION =1;
//创建数据库
public DBHelper(Context context,Stringname,CursorFactory factory,int version)
{
super(context, name, factory,version);
}
//创建表等机构性文件
public void onCreate(SQLiteDatabase db)
{
String sql ="create tablediary"+
"("+
"_idinteger primary key autoincrement,"+
"topicvarchar(100),"+
"contentvarchar(1000)"+
")";
db.execSQL(sql);
}
//若数据库版本有更新,则调用此方法
public void onUpgrade(SQLiteDatabasedb,int oldVersion,int newVersion)
{
String sql = "drop table ifexists diary";
db.execSQL(sql);
this.onCreate(db);
}
}


36.Service和Thread的区别





37.Android系统中GC什么情况下会出现内存泄漏

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: