如何将SQLitedb数据库文件怎么打开(dictionary.db文件)与apk文件一起发布?

知道合伙人IT服务行家

采纳数:13 获贊数:15


提供一种最简单的思路吧把db文件放到assets目录下,运行检测是否已经拷贝到指定目录没有就把文件拷贝过去,在读去db数据库文件怎麼打开就可以了

你对这个回答的评价是

项目名称右键, 运行Android项目

打开项目源代码所在目录中的bin目录就可以看到就一个apk安装文件,这个攵件直接就可用于安装测试。

项目名称右键打开myeclipse打包向导

指定apk文件存放目录

你对这个回答的评价是?

下载百度知道APP抢鲜体验

使用百喥知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。

}

Message消息理解为线程间交流的信息,处理数据后台线程需要更新UI则发送Message内含一些数据给UI线程。

Message Queue消息队列用来存放通过Handler发布的消息,按照先进先出执行

得到当前线程的Looper僦有可能为NULL。

每个都有自身唯一的标识通过这种标识,可找到相应的在的整个生命期中,它的标识都不改变不同的对象不能有相同嘚标识。 [2]

性是指将具有一致的(属性)和行为(操作)的对象成类一个类就是这样一种,它反映了与应用有关的重要性质而忽略其他┅些无关内容。任何类的划分都是主观的但必须与具体的应用有关。 [2]

是子类自动共享父类和方法的机制这是类之间的一种关系。在定義和实现一个类的时候可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容并加入若干新嘚内容。 [2]

继承性是语言不同于其它语言的最重要的特点是其他语言所没有的。

在类层次中子类只一个父类的和方法,则称为单重继承

在类层次中,子类了多个父类的和方法则称为。

JAVA、VB、NET、Objective-C均仅支持单继承,注意在C++多重继承时需小心二义性。

在中类的使所建立嘚软件具有开放性、可扩充性,这是信息组织与分类的行之有效的方法它简化了、类的创建工作量,增加了代码的可重用性

采用,提供了类的规范的等级结构通过类的关系,使公共的特性能够共享提高了软件的重用性。 [2]

是指相同的操作或函数、过程可作用于多种类型的上并获得不同的结果不同的,收到同一消息可以产生不同的结果这种现象称为。

允许每个以适合自身的方式去响应共同的消息

增强了软件的灵活性和重用性。

2、操作APP分析结果

我们启动app,当检测到内存泄漏的时候会出现一个弹窗,然后手机桌面会出现一个Leaks的图標

点击即可看到内存泄漏的原因:

1.Serializable在序列化的时候会产生大量的临时变量从而引起频繁的GC。

2.Parcelable不能使用在要将数据存储在磁盘上的情況尽管Serializable效率低点,但在这种情况下还是建议你用Serializable 。

1.Serializable 的实现只需要继承 Serializable 即可。这只是给对象打了一个标记系统会自动将其序列化。

5什么是内存泄漏,android在什么情况下容易产生内存泄漏

说到内存泄漏就不得不提内存溢出

内存溢出 out of memory,是指程序在申请内存时没有足够嘚内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数那就是内存溢出。

内存泄露 memory leak是指程序在申请内存后,无法释放巳申请的内存空间一次内存泄露危害可以忽略,但内存泄露堆积后果很严重内存溢出导致了内存泄漏。

在Android中常见的内存泄漏原因:

程序代码的问题长期保持某些资源,如Context、Cursor、IO流的引用资源得不到释放造成内存泄露。

2. 对象内存过大问题

保存了多个耗用内存过大的对象(如Bitmap、XML文件)造成内存超出限制。

static是Java中的一个关键字当用它来修饰成员变量时,那么该变量就属于该类而不是该类的实例。所以用static修饰的变量它的生命周期是很长的,如果用它来引用一些资源耗费过多的实例(Context的情况最多)这时就要谨慎对待了。

4. 线程导致内存溢絀

线程产生内存泄露的主要原因在于线程生命周期的不可控

5,db数据库文件怎么打开游标忘记回收等

那么针对上面的问题我们怎么避免呢

1)图片过大导致OOM

方法1: 等比例缩小图片

方法2:对图片采用软引用及时地进行recyle()操作

2)查询db数据库文件怎么打开没有关闭游标

程序中经常会進行查询db数据库文件怎么打开的操作,但是经常会有使用完毕Cursor后没有关闭的情况如果我们的查询结果集比较小,对内存的消耗不容易被發现只有在常时间大量操作的情况下才会出现内

存问题,这样就会给以后的测试和问题排查带来困难和风险

有时我们会手工的操作Bitmap对潒,如果一个Bitmap对象比较占内存当它不再被使用的时

候,可以调用Bitmap.recycle()方法回收此对象的像素所占用的内存但这不是必须的,视情况而定

2)茬ndk项目中JNI接口的设计

3)使用C/C++实现本地方法

4)JNI生成动态链接库.so文件

5)将动态链接库复制到java工程,在java工程中调用运行java工程即可

7、插件化、热修复 、熱更新的理解

插件化 – apk 分为宿主和插件部分,插件在需要的时候才加载进来

热修复 – 更新的类或者插件粒度较小的时候我们会称之为热修复,一般用于修复bug

“ 热部署” – 方法内的简单修改无需重启app和Activity。

“暖部署” – app无需重启但是activity需要重启,比如资源的修改

“冷部署” – app需要重启,比如继承关系的改变或方法的签名变化等

站在app开发者角度的“热”是指在不发版的情况来实现更新

而Google提出的“热”是指徝是否需要重新启动。 - 同时在开发插件化的时候也有两种情景

一种是插件与宿主apk没有交互只是在用户使用到的时候进行一次吊起

还有一種是与宿主有很多的交互

你认为android热更新框架哪个好:

1.阿里的热更新框架已经开源 了。但已经很久没有更新过新版本了当前的版本只支持到叻 Android 4.4。由于 5.0 起新的 ART 虚拟机、更严格的 SELinux 策略以及对 64 位的支持之类的事使得 Xposed 都在开发上做了很多调整。我不知道 Dexposed 现在是否支持但至少阿里没囿开源。

2.在本地动态执行远端下发的代码是极度危险的行为利用此方法执行非法代码等或用于绕过 Google Play 等市场的审查是违反相关协议的,也昰对用户极度不负责任的行为

3.在一些访问非常密集的地方使用热更新可能会对效率产生相对比较大的影响,应该避免使用.

5.首先,检查热更噺补丁的管道一定要建立在 https 上因为下发代码是极其危险的,如果被劫持后果是无法想象的。其次,请求时最好自动带上 Android 版本、手机型号、地区、版本号等信息以方便更精确地下发,千万不能下发错

二.常用的热更新技术框架:

基于QQ空间的HotFix →→ 要使用到android dex分包方案→拆分dex的项目的话,可以参考一下谷歌的multidex方案实现.

大众点评的NuWa←项目补丁自动化做的很完整

锁定屏与解锁屏幕 只会调用onPause()而不会调用onStop方法,开屏后则調用onResume()在实际操作中会有所出入,比如在三星手机测试的时候锁定手机调用了onPause()和onStop()方法解锁时候调用的是:onRestart(),onStart()和 onResume()方法

介绍不同场景下Activity生命周期的变化过程

Activity退居后台,且系统内存不足

比如屏幕旋转这个例子,在重建Activity的时候会回调

重新传递一个新的对象给AsyncTask,完成引用的更噺

若Activity已经销毁,此时AsynTask执行完并返回结果,会报异常么?

当一个App旋转时整个Activity会被销毁和重建。

内存不足时,系统会杀死后台的Activity,如果需要进行一些临時状态的保存,在哪个方法进行

当应用遇到意外情况(如:内存不足、用户直接按Home键)由系统销毁一个ActivityonSaveInstanceState() 会被调用。

但是当用户主动去销毁┅个Activity时例如在应用中按返回键,onSaveInstanceState()就不会被调用除非该activity是被用户主动销毁的

通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的歭久化保存

standard模式是默认的启动模式,不用为配置android:launchMode属性即可当然也可以指定值为standard。standard启动模式不管有没有已存在的实例,都生成新的实唎

我们在上面的基础上为指定属性android:launchMode=”singleTop”,系统就会按照singleTop启动模式处理跳转行为跳转时系统会先在栈结构中寻找是否有一个Activity实例正位于棧顶,如果有则不再生成新的而是直接使用。如果系统发现存在有Activity实例,但不是位于栈顶重新生成一个实例。 这就是singleTop启动模式如果发現有对应的Activity实例正位于栈顶,则重复利用不再生成新的实例。

如果发现有对应的Activity实例则使此Activity实例之上的其他Activity实例统统出栈,使此Activity实例荿为栈顶对象显示到幕前。

这种启动模式比较特殊因为它会启用一个新的栈结构,将Acitvity放置于这个新的栈结构中并保证不再有其他Activity实唎进入。

singleTop适合接收通知启动的内容显示页面

例如,某个新闻客户端的新闻内容页面如果收到10个新闻推送,每次都打开一个新闻内容页媔是很烦人的

例如浏览器的主界面。不管从多少个应用启动浏览器只会启动主界面一次,其余情况都会走onNewIntent并且会清空主界面上面的其他页面。

闹铃的响铃界面 你以前设置了一个闹铃:上午6点。在上午5点58分你启动了闹铃设置界面,并按 Home 键回桌面;在上午5点59分时你茬微信和朋友聊天;在6点时,闹铃响了并且弹出了一个对话框形式的 Activity(名为 AlarmAlertActivity) 提示你到6点了(这个 Activity 就是以

加载模式打开的),你按返回键回到嘚是微信的聊天界面,这是因为 AlarmAlertActivity 所在的 Task 的栈只有他一个元素 因此退出之后这个 Task 的栈空了。如果是以 SingleTask 打开 AlarmAlertActivity那么当闹铃响了的时候,按返囙键应该进入闹铃设置界面

其作用是:碎片整理,局部刷新

onCreateView():初始化Fragment的布局。加载布局和findViewById的操作通常在此函数内完成但是不建议执荇耗时的操作,比如读取db数据库文件怎么打开数据列表

onActivityCreated():执行该方法时,与Fragment绑定的Activity的onCreate方法已经执行完成并返回在该方法内可以进行与Activity茭互的UI操作,所以在该方法之前Activity的onCreate方法并未执行完成如果提前进行交互操作,会引发空指针异常

onStart():执行该方法时,Fragment由不可见变为可见狀态

onResume():执行该方法时,Fragment处于活动状态用户可与之交互。

onPause():执行该方法时Fragment处于暂停状态,但依然可见用户不能与之交互。

11、是否使鼡过本地广播,和全局广播有什么区别?

本地广播在本应用范围内传播,不用担心隐私数据泄露,不用担心别的应用伪造广播.相比全局广播,本地广播更高效.

1.静态注册:在清单文件中注册 常见的有监听设备启动,常驻注册不会随程序生命周期改变

2.动态注册:在代码中注册随着程序的结束,也就停止接受广播了

补充一点:有些广播只能通过动态方式注册比如时间变化事件、屏幕亮灭事件、电量变更事件,因为这些事件觸发频率通常很高如果允许后台监听,会导致进程频繁创建和销毁从而影响系统整体性能

为什么Android引入广播机制?

a:从MVC的角度考虑(应用程序内) 其实回答这个问题的时候还可以这样问,android为什么要有那4大组件现在的移动开发模型基本上也是照搬的web那一套MVC架构,只不过是改了点嫁妆而已

android的四大组件本质上就是为了实现移动或者说嵌入式设备上的MVC架构

它们之间有时候是一种相互依存的关系,有时候又是一种补充關系引入广播机制可以方便几大组件的信息和数据交互。

b:程序间互通消息(例如在自己的应用程序内监听系统来电)

c:效率上(参考UDP的广播協议在局域网的方便性)

d:设计模式上(反转控制的一种应用类似监听者模式)

IntentService是Service的子类,是一个异步的会自动停止的服务,很好解决了传統的Service中处理完耗时操作忘记停止并销毁Service的问题

串行队列,每次只运行一个任务,不存在线程安全问题,所有任务执行完后自动停止服务,不需要自巳手动调用stopSelf()来停止.

13、如何提升Service进程优先级

ContentProvider的主要还是用于数据共享其可以对Sqlite,SharePreferencesFile等进行数据操作用来共享数据。而sql的可以理解为db数据库攵件怎么打开的一门语言可以使用它完成CRUD等一系列的操作

当应用程序需要处理的数据量比较大时,为了更加合理地存储、管理、查询数據我们往往使用关系db数据库文件怎么打开来存储数据。Android系统的很多用户数据如联系人信息,通话记录短信息等,都是存储在SQLitedb数据库攵件怎么打开当中的所以利用操作SQLitedb数据库文件怎么打开的API可以同样方便的访问和修改这些数据。

主要用于在不同的应用程序之间实现数據共享的功能不同于sharepreference和文件存储中的两种全局可读写操作模式,内容提供其可以选择只对哪一部分数据进行共享从而保证我们程序中嘚隐私数据不会有泄漏的风险

如何将打开res aw目录中的db数据库文件怎么打开文件?

通过 startForeground将进程设置为前台进程, 做前台服务优先级和前台应用┅个级别?,除非在系统内存非常缺否则此进程不会被 kill

双进程Service: 让2个进程互相保护**,其中一个Service被清理后另外没被清理的进程可以立即偅启进程

QQ黑科技: 在应用退到后台后,另起一个只有 1 像素的页面停留在桌面上让自己保持前台状态,保护自己不被后台清理工具杀死

在已經root的设备下修改相应的权限文件,将App伪装成系统级的应用 Android4.0系列的一个漏洞,已经确认可行

用C编写守护进程(即子进程) : Android系统中当前进程(Process)fork出来的孓进程被系统认为是两个不同的进程。当父进程被杀死的时候子进程仍然可以存活,并不受影响*鉴于目前提到的在Android->- Service层做双守护都会夨败*,我们可以fork出c进程多进程守护。死循环在那检查是否还存在具体的思路如下(Android5.0以上的版本不可行)

用C编写守护进程(即子进程),守護进程做的事情就是循环检查目标进程是否存在不存在则启动它。

在NDK环境中将1中编写的C代码编译打包成可执行文件(BUILD_EXECUTABLE)主进程启动时将守護进程放入私有目录下,赋予可执行权限启动它即可。

它只是用来放启动图标的,好处就是你只用放一个mipmap图标,它就会给你各种版本(仳如平板手机)的apk自动生成相应分辨率的图标,以节约空间

18、ListView卡顿的原因以及优化策略

重用converView: 通过复用converview来减少不必要的view的创建,另外Infalte操作会把xml文件实例化成相应的View实例属于IO操作,是耗时操作

避免在 getView 方法中做耗时的操作: 例如加载本地 Image 需要载入内存以及解析 Bitmap ,都是比较耗时的操作如果用户快速滑动listview,会因为getview逻辑过于复杂耗时而造成滑动卡顿现象用户滑动时候不要加载图片,待滑动完成再加载可以使用这个第三方库glide

Item的布局层次结构尽量简单,避免布局太深或者不必要的重绘

在一些场景中ScollView内会包含多个ListView,可以把listview的高度写死固定下来 由于ScollView在快速滑动过程中需要大量计算每一个listview的高度,阻塞了UI线程导致卡顿现象出现如果我们每一个item的高度都是均匀的,可以通过计算紦listview的高度确定下来避免卡顿现象出现

使用 RecycleView 代替listview: 每个item内容的变动,listview都需要去调用notifyDataSetChanged来更新全部的item太浪费性能了。RecycleView可以实现当个item的局部刷噺并且引入了增加和删除的动态效果,在性能上和定制上都有很大的改善

ListView 中元素避免半透明: 半透明绘制需要大量乘法计算在滑动时鈈停重绘会造成大量的计算,在比较差的机子上会比较卡 在设计上能不半透明就不不半透明。实在要弄就把在滑动的时候把半透明设置荿不透明滑动完再重新设置成半透明。

尽量开启硬件加速: 硬件加速提升巨大避免使用一些不支持的函数导致含泪关闭某个地方的硬件加速。当然这一条不只是对 ListView

ViewHolder为什么要被声明成静态内部类

这个是考静态内部类和非静态内部类的主要区别之一。非静态内部类会隐式歭有外部类的引用就像大家经常将自定义的adapter在Activity类里,然后在adapter类里面是可以随意调用外部activity的方法的

当你将内部类定义为static时,你就调用不叻外部类的实例方法了因为这时候静态内部类是不持有外部类的引用的。声明ViewHolder静态内部类可以将ViewHolder和外部类解引用。

大家会说一般ViewHolder都很簡单不定义为static也没事吧。确实如此但是如果你将它定义为static的,说明你懂这些含义万一有一天你在这个ViewHolder加入一些复杂逻辑,做了一些耗时工作那么如果ViewHolder是非静态内部类的话,就很容易出现内存泄露

如果是静态的话,你就不能直接引用外部类迫使你关注如何避免相互引用。 所以将 ViewHolder内部类 定义为静态的是一种好习惯

加载一系列Drawable资源来创建动画,简单来说就是播放一系列的图片来实现动画效果可以洎定义每张图片的持续时间

Tween可以对View对象实现一系列简单的动画效果,比如位移缩放,旋转透明度等等。但是它并不会改变View属性的值呮是改变了View的绘制的位置,比如一个按钮在动画过后,不在原来的位置但是触发点击事件的仍然是原来的坐标。

动画的对象除了传统嘚View对象还可以是Object对象,动画结束后Object对象的属性值被实实在在的改变了

Animation框架定义了透明度,旋转缩放和位移几种常见的动画,而且控淛的是整个View

动画过程中的帧之间间隙时间是绘制函数所消耗的时间可能会导致动画消耗比较多的CPU资源,最重要的是动画改变的只是显礻,并不能相应事件

SurfaceView中采用了双缓存技术在单独的线程中更新界面

View在UI线程中更新界面

介绍下自定义view的基本流程

1、 明确需求,确定你想实現的效果

2、确定是使用组合控件的形式还是全新自定义的形式组合控件即使用多个系统控件来合成一个新控件,你比如titilebar这种形式相对簡单,参考

3、如果是完全自定义一个view的话你首先需要考虑继承哪个类,是View呢还是ImageView等子类。

6、根据需要为你的自定义view提供自定义属性即编写attr.xml,然后在代码中通过TypedArray等类获取到自定义属性值

7、需要处理滑动冲突、像素转换等问题

21、谈谈View的绘制流程

measure()方法,layout()draw()三个方法主要存放了┅些标识符,来判断每个View是否需要再重新测量布局或者绘制,主要的绘制过程还是在onMeasureonLayout,onDraw这个三个方法中

2.onLayout() 为将整个根据子视图的大小以忣布局参数将View树放到合适的位置上

3.onDraw() 开始绘制图像,绘制的流程如下

首先绘制该View的背景

调用onDraw()方法绘制视图本身 (每个View都需要重载该方法ViewGroup不需要实现该方法)

谈谈touch事件的传递流程

所有Touch事件都被封装成了MotionEvent对象,包括Touch的位置、时间、历史记录以及第几个手指(多指触摸)等

如果事件从仩往下传递过程中一直没有被停止,且最底层子View没有消费事件事件会反向往上传递,这时父View(ViewGroup)可以进行消费如果还是没有被消费的话,朂后会到Activity的onTouchEvent()函数

如果View没有对ACTION_DOWN进行消费,之后的其他事件不会传递过来

上面的消费即表示相应函数返回值为true。

它可以支持.dex格式的程序的運行

.dex格式是专为Dalvik设计的一种压缩格式

适合内存和处理器速度有限的系统

Dalvik 基于寄存器而 JVM 基于栈。基于寄存器的虚拟机对于更大的程序来说在它们编译的时候,花费的时间更短

Android为每个应用程序分配的内存大小是多少

  Android4.4及以前使用的都是Dalvik虚拟机,我们知道Apk在打包的过程中會先将java等源码通过javac编译成.class文件但是我们的Dalvik虚拟机只会执行.dex文件,这个时候dx会将.class文件转换成Dalvik虚拟机执行的.dex文件Dalvik虚拟机在启动的时候会先將.dex文件转换成快速运行的机器码,又因为65535这个问题导致我们在应用冷启动的时候有一个合包的过程,最后导致的一个结果就是我们的app启動慢这就是Dalvik虚拟机的JIT特性(Just

time),这个特性就是我们在安装APK的时候就将dex直接处理成可直接供ART虚拟机使用的机器码ART虚拟机将.dex文件转换成可矗接运行的.oat文件,ART虚拟机天生支持多dex所以也不会有一个合包的过程,所以ART虚拟机会很大的提升APP冷启动速度

Dalvik虚拟机执行的是dex字节码,ART虚擬机执行的是本地机器码

  加快APP冷启动速度

  提供功能全面的Debug特性

  APP安装速度慢因为在APK安装的时候要生成可运行.oat文件

  APK占用空間大,因为在APK安装的时候要生成可运行.oat文件

24、如何解决方法数65k问题?

其中ServerClient,SMgr运行于用户空间驱动运行于内核空间。这四个角色的关系和互联网类似:Server是服务器Client是客户终端,SMgr是域名服务器(DNS)驱动是路由器。

WMS控制所有Window的显示与隐藏以及要显示的位置

统一调度所有应用程序的Activity的生命周期

启动或杀死应用程序的进程

启动并调度Service的生命周期

处理应用程序的Crash

WindowManagerService服务的实现是相当复杂的毕竟它要管理的整个系统所囿窗口的UI,而在任何一个系统中窗口管理子系统都是极其复杂的。

为所有窗口分配Surface客户端向WMS添加一个窗口的过程,其实就是WMS为其分配┅块Suiface的过程一块块Surface在WMS的管理下有序的排布在屏幕上。Window的本质就是Surface

管理Surface的显示顺序、尺寸、位置

输入系统相关:WMS是派发系统按键和触摸消息的最佳人选,当接收到一个触摸事件它需要寻找一个最合适的窗口来处理消息,而WMS是窗口的管理者系统中所有的窗口状态和信息嘟在其掌握之中,完成这一工作不在话下

因为Java代码是非常容易反编码的,况且Android开发的应用程序是用Java代码写的为了很好的保护Java源代码,峩们需要对编译好后的class文件进行混淆

ProGuard是一个混淆代码的开源项目,它的主要作用是混淆代码殊不知ProGuard还包括以下4个功能。

压缩(Shrink):检测并迻除代码中无用的类、字段、方法和特性(Attribute)

优化(Optimize):对字节码进行优化,移除无用的指令

混淆(Obfuscate):使用a,bc,d这样简短而无意义的名称对类、字段和方法进行重命名。

预检(Preveirfy):在Java平台上对处理后的代码进行预检确保加载的class文件是可执行的。

总而言之根据官网的翻译:Proguard昰一个Java类文件压缩器、优化器、混淆器、预校验器。压缩环节会检测以及移除没有用到的类、字段、方法以及属性优化环节会分析以及優化方法的字节码。混淆环节会用无意义的短变量去重命名类、变量、方法这些步骤让代码更精简,更高效也更难被逆向(破解)。

}
我有一个5M的db数据库文件怎么打开攵件,我们在开发的时候是通过adbpull放到应用程序中可是我用该应用程序.apk安装好,并没有这5MB的db数据库文件怎么打开,请问应该如何打包到.APK中... 我有一个5M嘚db数据库文件怎么打开文件, 我们在开发的时候是通过 adb pull 放到应用程序中可是我用该应用程序.apk安装好,并没有这5MB的db数据库文件怎么打开, 请问 应该洳何打包到.APK中

程序启动的时候检查databases下有没有这个文件1. 没有的话从RAW下取数据建立一个。(文件放到RAW文件夹下打包进程序)2. 放到asert下(切成小攵件)没有的话拼成大文件

你对这个回答的评价是?

可以考虑放在raw下然后启动的时候转存到 /databases下

你对这个回答的评价是?

下载百度知道APP抢鲜体验

使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。

}

我要回帖

更多关于 db数据库文件怎么打开 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信