85什么是android 应用程序的稳定性

85什么是android 应用程序的稳定性,第1张

应用程序组件是Android应用程序的基本构建单元。每个组件是系统进入你的应用程序的不同入口点。不是所有的组件对于用户都是实际上的入口点,有些是互相依赖的,但是每个组件都有特定的作用——每个都是唯一的构建单元,这些构建单元定义你应用程序的全部行为

有四种不同类型的应用程序组件。每种都有不同的用处并且有不同的生命周期。生命周期定义了他们是怎样被创建和销毁的。

四类不同的应用程序组件分别有:

Activities

一个Activity代表一个单独的拥有用户界面的屏幕。比如,一个邮件应用程序可能拥有一个显示新邮件的列表的Activity,一个编写邮件的Activity,一个读邮件的Activity。虽然这些Activity一起工作,但是他们是相互独立的。因此一个不同的应用程序也可以启动这些Activity中的任何一个(如果邮件应用程序允许的话)。比如一个摄像头应用程序为了能让用户分享一张图片它能启动邮件应用程序中的编写邮件的Activity。

一个Activity是由Activity类的子类来实现的。

Services

一个Service组件是运行在后台的一个进程,这个进程处理一个余数长时间的 *** 作或者是一个远程调用。一个Service不需要提供一个用户界面。比如,一个Service可以在用户运行一个不同程序的同时在后台播放音乐,或者在竖薯首不阻塞一个Activity的用户界面的同时获取网络数据。其他的组件,比如一个Activity,可以启动一个Service并且与之交互。

一个Service是由Service的子类来实现的。

Content providers

一个Content provider管理一组共享的应用程序数据。你可以把这些数据存储到文件系统、一SQLite数据库、互联网或者任何你的应用程序可以访问的持久化存储设备中。通过Content provider其他的应用程序能够查询甚至修改(如果Content provider允许修改 *** 作)这些数据。例如Android系统提供了管理联系人信息的Content provider。因此,任何一个应用程序在拥有相应权限的情况下都可以访问这个Content provider管理的数据(比如ContactsContract.Data)来读取或者修改某个联系人的信息。

Content provider用于管理应用程序不与其他程序共享的的私有数据也是非常有用的。不如Note Pad例子程序就使用了一个Content provider来存储数据。

一个Content Provider是由ContentProvider的子类来实手销现的,并且必须实现一组使其他应用程序能与之通信的API。更多信息请参照Content Providers开发者指南。

Broadcast receivers

一个Broadcast receiver组件用于响应整个系统的广播通知。大量的广播都是由系统产生的。例如屏幕关闭的广播,电量不足的广播,拍了一张相片的广播。应用程序也可以发出广播,例如让其他应用程序知道一些数据已从网上下载了,并且它们可以使用这些数据。虽然broadcast receiver不显示用户界面,但是当广播事件发生的时候他们可以创建一个状态栏通知来提示用户。更加普遍的情况是,一个Broadcast receiver只是一扇通向其他组件的“大门”,它只做非常少量的工作。例如它可以基于一个广播事件启动一个Service来完成一些工作。

一个Broadcast receiver是由BroadcastReceiver的子类来实现的,并且每个广播都是当作一个Intent对象来传递的。

Android系统的一个独一无二的设计就是一个应用程序可以启动其它应用程序的组件。例如如果你希望用户通过摄像头来拍摄一张照片,而其他应用程序已经实现了这个功能,那么你的应用程序可以直接使用它,而不是自己开发一个Activity来实现这一功能。你不需要通过合并或者事件链接到摄像头应用程序的代码,而是直接启动摄像头应用程序实现拍照功能的Activity。当拍照完成时,照片功过事件返回到你的应用程序中。对于用户来说,看起来拍照功能就是你的应用程序的一部分。

当系统启动一个组件的时候,它为应用程序开启一个进程(如果应用程序还没有运行),并且实例化这个组件需要的所有的类。例如,如果你的应用程序启动一个摄像头应用程序中实现拍照功能的Activity,这个Activity运行在属于摄像头应用程序的进程中,而不是你的应用程序的进程中。因此,和其它大多数 *** 作系统不一样,Android应用程序不止一个单独的入口。(例如,没有main函数)

因为每个应用程序运行在独立的进程中,并且每个进程都有文件权限来限制其它程序的访问,你的应用程序不能直接启动其它应用程序的组件。尽管如此,Android系统可以启动它们。因此,你必须传递一个消息给Android系统,这个消息定义了你想启动某个组件的意图,Android系统接收到这个消息后为你启动其他应用程序的组件。

启动组件

四种组件中的三种——Activity、Service和Broadcast receiver——通过被称作Intent的异步消息启动。Intent在运行时把独立的组件互相绑定(你可以认为Intent是组件为了请求一个 *** 作派出的信使),不管这个组件是属于你的应用程序还是他的应用程序。

一个Intent对象创建一个Intent,它定义了一个启动某个或者某种组件的消息。一个Intent的意图分别可以是明确的,也可以是含蓄的。

对于Activity和Service来说,一个Intent定义了一个行为(例如,“展示”或者“发送”一些东西)和指定相关的数据的URI(其中包括启动组件可能需要知道的数据)。例如,一个Intent可能传递一个Activity的请求来显示一张图片或者打开一个网页。在某些情况下,你能够启动一个Activity来接收Intent中的数据,这个Activity也返回一个数据包含在Intent中(例如,你发布了一个Intent让用户选取一个联系人信息,并且返回给你,返回的Intent中包含了指向选取的联系人信息的URI)。

对于Broadcast receiver来说,Intent只是简单地定义了被广播的公告(例如一个显示设备电池电量低的广播只包括一个指出“电量低”的 *** 作字符串)。

其他类型的组件,Content provider,不是由Intent来启动,而是在ContentResolver向它发出一个请求时被启动。Content resolver处理所有与Content provider的直接相关的事务,因此组件不需要直接与Content provider通信,替而代之调用ContentResolver对象的方法。这样在Content provider和组件请求信息之间保留了一个抽象层(为了安全)。

启动每种组件都有不同的方法:

l 你可以通过传递一个Intent对象到startActivity()或者startActivityForResult()(当你希望这个Activity返回结果时)方法来启动一个Activity。

l 你可以通过传递一个Intent对象到startService()方法来启动一个Service(或者传递新的指令到正在运行的Service)。或者你可以通过传递一个Intent对象到bindService()来绑定到Service。

l 你可以通过传递一个Intent对象到sendBroadcast(),sendOrderedBroadcast()或者sendStickyBroadcast()方法来发布一个广播。

l 你可以通过调用ContentResolver对象上的query()方法来对一个Content provider执行查询 *** 作。

1、AsyncTasks和配置信息改变

AsyncTasks(异步任务)经常用于实现后台 *** 作,以及 *** 作完成后选择性更新用户界面。使用AsyncTasks和处理配置信息的改变(Configuration Changes)是常见漏洞的来源。当AsyncTask正在运行时,如果fragment与对应的activity脱离,当尝试进入activity时举斗,你的应用就会调用栈时崩溃,例如下面这个崩溃:

java.lang.IllegalStateException: Fragment MyFragment not attached to Activity

at android.support.v4.app.Fragment.getResources(Fragment.java:551)

at android.support.v4.app.Fragment.getString(Fragment.java:573)

在堆栈的最顶端,fragment要依赖一个有效的activity来获取应用的资源。预防这种崩溃的一种方法,是在配置发生变化时保留该AsyncTask任务。实现这种方法可以使用RetainedFragment来执行AsyncTask并通知监听器关于AsyncTask *** 作的状态。更多信息请查看这个示例FragmentRetainInstance.java

2、安全地执行Fragment Transaction

Fragment transactions用于在一个Activity上添加、核或移除或者替换fragment。大多数时候,fragment transaction会在activity的onCreate()方法中执行,也可能在与用户交互中响应。然而,我们看过很多的例子都是当恢复一个activity时,fragment transaction被执行了。发生这种情况时,你的应用就可能发生正氏磨下面的下崩溃:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1327)

at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager:1338)

at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)

at android.support.v4.app.BackStackRecord.commit(BackStackRecord:574)

at android.support.v4.app.DialogFragment.show(DialogFragment:127)

不管何时,如果一个FragmentActivity放在后台,对应FragmentMangerImpl中mStateSaved的flag就会设置为true。这个flag是用来检查是否有state loss。当试图执行一个transaction时,如果这个flag为true,那么首先会抛出IllegalStateException异常。要防止state loss,在onSaveInstanceState()方法调用前,不能执行fragment transaction。发生崩溃可能会的原因是,状态已经保存但flag还没有设置回false就已经调用了onResume()方法。

要预防这种崩溃,就要防止在activity的onResume()方法中执行fragment transactions。不然就使用onResumeFragment()方法,这个方法推荐用来解决在合适的状态与fragment打交道的情形。

3、管理Cursor的生命周期

CursorAdapter可以容易地将Cursor的数据绑定在一个ListView对象上。然而,如果一个cursor变为无效时,如果更新用户界面,就会发生下面的崩溃:

java.lang.IllegalStateException: this should only be called when the cursor is valid

at android.support.v4.widget.CursorAdapter.getView(CursorAdapter.java:245)

at android.widget.HeaderViewListAdapter.getView(HeaderViewListAdapter.java:253)

当CursorAdapter的mDataValid字段设置为false时,就会抛出这个异常。发生这种情况的原因如下:

cursor被设置为空;

cursor上的一个重新查询 *** 作失败了;

data上的onInvalidated()方法被调用了。

发生这种情况的一个原因是,是否同时使用CursorLoader和startManagingCursor()方法来管理你的cursor。startManagingCursor()已经被弃用了,取而代之的是CursorLoader。如果你正使用fragments,请确保使用CursorLoader来管理cursor的生命周期,并且移除所有startManagingCursor()和stopManagingCursor()方法的引用。

小结

通过上述三个注意事项,能大大减少Support Library抛出致命异常的机率。这样能带来更好的用户体验,更好的评分和一个更成功的应用。

Crashlytics for Android会报告来由Support Library或者应用其它地方抛出的未捕获异常。添加Android SDK到你的应用上,来看看还有哪些被你忽略的崩溃吧。

win10 mobile直接安装安卓应用的方法如下:1、解压好sdk保证ADB命令能用(需要自行了解下)。2、解压 上述工具 到某文件夹, 自行安装 IpOverUsbInstaller.msi 和 vcredist_x86.exe。3、打开wp10手机, 设置--更新和安全--面向开发人员 : 勾选开发人员模式 ,打开设备发现4、在解压刚才压缩包的目录(假设z:tools)打开 命令行模式:1) usb连接手机 :运行 D:toolswconnect.exe usb谨慎2)wifi链接手机 (只要电脑和wp10手机在一个路由器网下,这个比usb链接稳定。。。):D:toolswconnect.exe 192.168.xxx.xxx两种方法都可以,运行顺利的话,会提示 输入配对pin码。此时在手机上点配对,会显示pin码,把pin码抄到电脑命令行后回车。成功链接的提示是这样的:5. 这个时候可以用在命令行窗口用adb命令试下 (adb的目录自己定位)adb devices应该会列扒闹出上述 emulator-5554。 (微软还真是在wp10里放了个模拟器。。。)如图的话就能装了。把春晌罩apk下载到这个目录,命令输入:adb install xxx.apk


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12506659.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-25
下一篇2025-08-25

发表评论

登录后才能评论

评论列表(0条)

    保存