一切福田,不離方寸,從心而覓,感無不通。

Category Archives: Android

移动 App 开发人员应该关注的 7 件事

Apple App Store里有130万的app,而Google Play则托管了140万的app。在竞争如此激烈的移动应用环境中如何确保我们制作的app能获得大量的下载量呢? 广受用户欢迎,并创下了上百万的下载量是每一个移动app开发人员的终极梦想。但是,这谈何容易呢! 在最近的一次网络研讨会上,Rahui Nischal,Nucleus Software Exports公司的高级产品经理,就谈到了开发人员要想创建有吸引力的移动app,所需要关注的几个关键方面。 1.理念是根本 一个移动app的成功取决于它是建立在什么样的核心理念上的。对于开发人员而言,第一步要做的是像目标用户那样思考,用他们的眼光去看待问题,并 在此基础上构建移动app,构建可以让他们的生活更简单的app。步步为营,不断地检查app与最终用户的相关性,积极调整产品以满足用户的需求。 2.单一的服务目标 一个移动app只需要具备单一的功能。确定你app的主要目的,然后钻研能否只通过一到两次点击就可以访问进入。 3.保持简单 保持一切简单化其实是最难的。如果移动开发人员可以成功地将复杂的技术隐藏在简单界面的后面,那么他就越靠近成功。 4.保持轻量级 三年前,Facebook的应用程序重达35-40M。现在,它只有大约10M。之所以会产生如此大的变化,是因为Facebook认识到,在印度和非洲——甚至连3G还尚未普及的区域,下载重量级的移动应用程序往往需要一段又长又难挨的时间。 由于现在的移动app都是面向全球的,所以开发人员最好能够创建轻量级的应用程序以便适应不同地域。 5.UI很重要 WhatsApp在推出之前从来不做广告。虽然现在网上提供了许多的聊天应用程序,但是WhatsApp的用户使用量还是达到了成倍的增长。它成功的秘诀就是干净和简单的UI。为了确保界面友好,我们在创造移动应用的时候需要关注三件事——愉悦性、实用性和功能性。 6.倾听用户的声音 应用程序在发布之后,开发人员应该时刻关注用户的反馈,更新进步,努力提供更新更好的功能。 7.了解用户行为 游戏“愤怒的小鸟”的开发人员发现,Android用户不喜欢为下载应用程序付费,而iOS用户,大多数则愿意购买app,但却讨厌在免费app上面看到任何广告。了解不同的用户行为,有助于移动开发人员为不同类型的用户创建令人满意的消费体验。 from:http://www.oschina.net/news/64613/mobile-app-developers-should-focus-on-7-things

龙生   28 Jul 2015
View Details

推荐 11 款 React Native 开源移动 UI 组件

本文推荐 11 个非常棒的 React Native 开源组件,希望能给移动应用开发者提供帮助。 React Native 是近期 Facebook 基于 MIT 协议开源的原生移动应用开发框架,已经用于 Facebook 的生产环境。React Native 可以使用最近非常流行的 React.js 库来开发 iOS 和 Android 原生 APP。 1. iOS 表单处理控件 tcomb-form-native tcomb-form-native 是 React Native 强大的表单处理控件,支持 JSON 模式,可插拔的外观和感觉。在线演示:http://react.rocks/example/tcomb-form-native。 2. 摄像机视图 react-native-camera react-native-camera 是 React Native 的摄像头 viewport。这个模块应用于开发的早期阶段,它支持摄像头的转换和基本图片捕捉。 使用示例: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 var React = require('react-native'); var {   AppRegistry,   StyleSheet,   Text,   View, } = React; var Camera = require('react-native-camera'); var cameraApp = React.createClass({   render: function() { […]

龙生   04 Apr 2015
View Details

Android之SQLiteOpenHelper应用

1.SQLiteOpenHelper SQliteOpenHelper是一个抽象类,来管理数据库的创建和版本的管理。要使用它必须实现它的nCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase, int, int)方法 onCreate:当数据库第一次被建立的时候被执行,例如创建表,初始化数据等。 onUpgrade:当数据库需要被更新的时候执行,例如删除久表,创建新表。 2.实现代码 package xqh.utils; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteDatabase.CursorFactory; public class DBHelper extends SQLiteOpenHelper {     //数据库版本       private static final int VERSION = 1;     //新建一个表       String sql = "create table if not exists TestUsers"+     "(id int primary key,name varchar,sex varchar)";     public DBHelper(Context context, String name, CursorFactory factory,             int version) {         super(context, name, factory, version);     }     public DBHelper(Context context,String name,int version){         this(context,name,null,version);     }     public DBHelper(Context context,String name){         this(context,name,VERSION);     }     @Override     public void onCreate(SQLiteDatabase db) {         db.execSQL(sql);     }     @Override     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {     } } 3.SQLite的使用 Android提供了一个名为SQLiteDatabase的类,它封装了一些操作数据库的API。使用它能实现基本的CRUD操作,通过getWritableDatabase()和getReadableDatabase()可以获取数据库实例。 4.实现代码 package xqh.sqlite; import xqh.utils.DBHelper; import android.app.Activity; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.widget.Button; import android.util.Log; import android.view.View; import android.view.View.OnClickListener;; public class TestSQLite extends Activity {     Button textBtn = null;     Button btnCreateDb = null;     Button btnCreateTb = null;     Button btnInsert = null;     Button btnUpdate = null;     Button btnDelete = null;     DBHelper dbHelper = null;     SQLiteDatabase db = null;     @Override     protected void onCreate(Bundle savedInstanceState) {         // TODO Auto-generated method stub           super.onCreate(savedInstanceState);         setContentView(R.layout.sqlitetest);         OpenDb();         textBtn = (Button)findViewById(R.id.btnHeader);         textBtn.setFocusable(true); //        btnCreateDb = (Button)findViewById(R.id.btnCreateDb);   //        btnCreateDb.setOnClickListener(createDbListener);   //           //        btnCreateTb = (Button)findViewById(R.id.btnCreateTb);   //        btnCreateTb.setOnClickListener(createTbListener);           btnInsert = (Button)findViewById(R.id.btnInsert);         btnInsert.setOnClickListener(insertTbListener);         btnUpdate = (Button)findViewById(R.id.btnUpdate);         btnUpdate.setOnClickListener(updateTbListener);         btnDelete = (Button)findViewById(R.id.btnDelete);         btnDelete.setOnClickListener(deleteTbListener);     }     public OnClickListener deleteTbListener = new OnClickListener() {         public void onClick(View v) {             DeleteTb();         }     };     public OnClickListener updateTbListener = new OnClickListener() {         public void onClick(View v) {             UpdateTb();         }     }; […]

龙生   16 Aug 2014
View Details

Android SQLiteHelper类

package com.w3cnet.db; import android.content.Context; import android.content.ContentValues; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.Cursor; public class SqliteHelper extends SQLiteOpenHelper{ private final static String DATABASE_NAME = "db_name"; private final static int DATABASE_VERSION = 1; private final static String TABLE_NAME = "mytable"; private final static String FIELD_ID = "ID"; private final static String FIELD_NAME = "NAME"; public SqliteHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { String sql = "Create table %s (%s integer primary key autoincrement,%s text);"; sql = String.format(sql, TABLE_NAME, FIELD_ID, FIELD_NAME); db.execSQL(sql); } @Override […]

龙生   04 May 2014
View Details

Android应用程序的四个关键点

对于一个Android应用程序来说,是由四种关键构造块组织而成的,这四种构造块分别是:Activity、Intent Receiver、Service、Content Provider 但是,并不是每一个Android应用程序都需要这四种构造块,这不是必须的,某些时候,我们只需要这四种中的几种组合成我们的应用。 当我们明确了我们的应用需要哪些构造块后,我们就需要在AndroidManifest.xml中登记这些构造块的清单。这是一个XML配置文件,这个配置文件用于定义我们的应用程序的组件、组件的功能及必要条件等。这个配置文件是每个Android应用必需的。对于AndroidMainfest.xml的Schema,我们对四种构造块做一些说明: 1、Activity Activity是Android构造块中最基本的一种,在应用中,一个 activity通常就是一个单独的屏幕。每一个activity都被实现为一个独立的类,并且继承于Activity这个基类。这个activity类将会显示由几个Views控件组成的用户接口,并对事件做出响应。大部份的应用都会包含多个的屏幕。例如,一个短消息应用程序将会有一个屏幕用于显示联系人列表,第二个屏幕用于写短消息,同时还会有用于浏览旧短消息及进行系统设置的屏幕。每一个这样的屏幕,就是一个activity。从一个屏幕导航到另一个屏幕是很简单的。在一些应用中,一个屏幕甚至会返回值给前一个屏幕。 当一个新的屏幕打开后,前一个屏幕将会暂停,并保存在历史堆栈中。用户可以返回到历史堆栈中的前一个屏幕。当屏幕不再使用时,还可以从历史堆栈中删除。默认情况下,Android将会保留从主屏幕到每一个应用的运行屏幕。 Android使用了Intent这个特殊类,实现在屏幕与屏幕之间移动。 Intent类用于描述一个应用将会做什么事。在Intent的描述结构中,有两个最重要的部分:动作和动作对应的数据。典型的动作类型有:MAIN(activity的门户)、VIEW、PICK、EDIT等。而动作对应的数据则以URI的形式进行表示。例如:要查看一个人的联系方式,你需要创建一个动作类型为VIEW的intent,以及一个表示这个人的URI。 与之有关系的一个类叫IntentFilter。相对于intent是一个有效的做某事的请求,一个intent filter则用于描述一个activity(或者Intent Receiver)能够操作哪些intent。一个activity如果要显示一个人的联系方式时,需要声明一个IntentFilter,这个 IntentFilter要知道怎么去处理VIEW动作和表示一个人的URI。IntentFilter需要在AndroidManifest.xml中定义。 通过解析各种intent,从一个屏幕导航到另一个屏幕是很简单的。当向前导航时,activity将会调用 startActivity(Intent myIntent)方法。然后,系统会在所有安装的应用程序中定义的IntentFilter中查找,找到最匹配myIntent的Intent对应的 activity。新的activity接收到myIntent的通知后,开始运行。当startActivity方法被调用将触发解析myIntent 的动作,这个机制提供了两个关键好处: ◆Activities能够重复利用从其它组件中以Intent的形式产生的一个请求; ◆Activities可以在任何时候被一个具有相同IntentFilter的新的Activity取代。 2、Intent Receiver 当你希望你的应用能够对一个外部的事件(如当电话呼入时,或者数据网络可用时,或者到了晚上时)做出响应,你可以使用一个Intent Receiver。虽然Intent Receiver在感兴趣的事件发生时,会使用NotificationManager通知用户,但它并不能生成一个UI。Intent Receiver在AndroidManifest.xml中注册,但也可以在代码中使用 Context.registerReceiver()进行注册。当一个intent receiver被触发时,你的应用不必对请求调用intent receiver,系统会在需要的时候启动你的应用。各种应用还可以通过使用Context.broadcastIntent()将它们自己的 intent receiver广播给其它应用程序。 3、Service 一个Service是一段长生命周期的,没有用户界面的程序。比较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器。在一个媒体播放器的应用中,应该会有多个activity,让使用者可以选择歌曲并播放歌曲。然而,音乐重放这个功能并没有对应的activity,因为使用者当然会认为在导航到其它屏幕时音乐应该还在播放的。在这个例子中,媒体播放器这个 activity会使用Context.startService()来启动一个service,从而可以在后台保持音乐的播放。同时,系统也将保持这个service一直执行,直到这个service运行结束。另外,我们还可以通过使用Context.bindService()方法,连接到一个service上(如果这个service还没有运行将启动它)。当连接到一个service之后,我们还可以service提供的接口与它进行通讯。拿媒体播放器这个例子来说,我们还可以进行暂停、重播等操作。 4、Content Provider 应用程序能够将它们的数据保存到文件中、SQL数据库中,甚至是任何有效的设备中。当你想将你的应用数据与其它的应用共享时,Content Provider将会很有用。一个Content Provider类实现了一组标准的方法,从而能够让其它的应用保存或读取此Content Provider处理的各种数据类型。   from:http://mobile.51cto.com/mobile-114018.htm

龙生   25 Apr 2014
View Details

Android应用开发入门五问

1. Android是什么? Android 是Google开发的基于Linux平台的开源手机操作系统。它包括操作系统、用户界面和应用程序 —— 移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍。谷歌与开放手机联盟合作开发了 Android,这个联盟由包括中国移动、摩托罗拉、高通、宏达和 T-Mobile 在内的 30 多家技术和无线应用的领军企业组成。 Android 作为谷歌企业战略的重要组成部分,将进一步推进"随时随地为每个人提供信息"这一企业目标的实现。 2. Android用什么语言开发的? Android的SDK(software development kit)是Java的,将来可能有其他语言版本。 SDK下载地址:http://code.google.com/android/download.html 3. Android模拟器是用什么开发的? Android的核心是Java虚拟机,为了高效,目前来看,google是不会支持其它语言的开发的。不过,android的模拟器是用qeum开发的,它的镜像文件分成4部分放在tools目录下,如果我们将qeum修改一下,说不定能玩一下它的linux系统。 4. 怎么进行Android开发? Android支持在模拟器上运行和调试应用软件,有兴趣的朋友可以下载他的SDK(software development kit)来了解android的界面;然后应该学习android的基本框架和应用程序的构成;最后就可以试着在sdk的API Demo的基础上开发自己的application了。 希望刚刚了解软件开发的朋友不要着急,一步一个脚印,一定会茁壮成长,开发优秀的application的。 5. 有哪些好的网络资源可供Android学习者用的呢? 首先,最好的最基本的学习资料无疑是SDK的文档了,也就是这个地方(http://code.google.com/intl/zh-CN/android/documentation.html)的介绍,它循序渐进的介绍了Android的各个方面。 其次,大家可能有对android文档不太理解的地方,或者自己的想法等等,完全可以通过下面的groups进行咨询和交流: ◆Android Beginner    http://groups.google.com/group/android-beginners?lnk= ◆Developper Groups   http://groups.google.com/group/android-developers ◆Android Internals   http://groups.google.com/group/android-internals?lnk= ◆Android Porting     http://groups.google.com/group/android-porting?lnk= 【编辑推荐】 Android创建和使用数据库详细指南 细看Google Android的开源姿态 分析称Android 2012年超越iPhone平台 from:http://mobile.51cto.com/android-114004.htm

龙生   25 Apr 2014
View Details

在eclipse中实现代码的自动换行

可以使用ctrl + shift + f 来格式化代码; 可以使用安装插件wordwrap来实现代码的自动换行:Help ->Install new Software->work with,点击Add,输入 name:wordwrap url:http://ahtik.com/eclipse-update/ 安装成功后重启eclipse   from:http://liangfangli86.blog.163.com/blog/static/9684863120116183727729/

龙生   08 Apr 2014
View Details

高效开发 Android App 的 10 个建议

假如要Google Play上做一个最失败的案例,那最好的秘诀就是界面奇慢无比、耗电、耗内存。接下来就会得到用户的消极评论,最后名声也就臭了。即使你的应用设计精良、创意无限也没用。 耗电或者内存占用等影响产品效率的每一个问题都会影响App的成功。这就是为什么在开发中确保最优化、运行流畅而且不会使Android系统出问题 是至关重要的了。这里不需要讨论高效编程,因为我们不会关心你写的代码是否能够经得起测试。即使高效的代码也是需要时间来运行。今天这篇文章我们就讲讲怎 么尽可能地缩短运行时间,以及如何开发用户喜欢的App。 高效地利用线程 建议一:怎么在后台取消一些线程中的动作 我们知道App运行过程中所有的操作都默认在主线程(UI线程)中进行的,这样App的响应速度就会受到影响。会导致程序陷入卡顿、死掉甚至会发生系统错误。 为了加快响应速度,需要把费时的操作(比如网络请求、数据库操作或者复杂的计算)从主线程移动到一个单独的线程中。最高效的方式就是在类这一级完成 这项操作,可以使用AsyncTask或者IntentService来创建后台操作。如果选择使用IntentService,它会在需要的时候启动起 来,然后通过一个工作线程来处理请求(Intent)。 使用IntentService时需要注意以下几点限制: 这个类不要给UI传递信息,如果要向用户展示处理结果信息请用Activity; 每次只能处理一个请求; 每一个处理请求过程都不能中断; 建议二:怎么保持响应不发生ANR 从UI线程中移除费时操作这个方式还可以防止用户操作出现系统不响应(ANR)对话框。需要做的就是继承AsyncTask来创建一个后台工作线程,并实现doInBackground()方法。 还有一种方式就是自己创建一个Thread类或者HandlerThread类。需要注意这样也会使App变慢,因为默认的线程优先级和主线程的优先级是一样的,除非你明确设定线程的优先级。 建议三:怎么在线程中初始化查询操作 当查询操作正在后台处理时,展示数据也不是即时的,但是你可以使用CursorLoader对象来加快速度,这个操作可以使Activity和用户之间的互动不受影响。 使用这个对象后,你的App会为ContentProvider初始化一个独立的后台线程进行查询,当查询结束后就会给调用查询的Activity返回结果。 建议四:其它需要注意的方面 使用StrictMode来检查UI线程中可能潜在的费时操作; 使用一些特殊的工具如Systrace或者Traceview来寻找在你的应用中的瓶颈; 用进度条向用户展示操作进度; 如果初始化操作很费时,请展示一个欢迎界面。 优化设备的电池寿命 如果应用很费电,请不要责怪用户卸载了你的应用。对于电池使用来说,主要费电情况如下: 更新数据时经常唤醒程序; 用EDGE或者3G来传递数据; 文本数据转换,进行非JIT正则表达式操作。 建议五:怎么优化网络 如果没有网络连接,请让你的应用跳过网络操作;只在有网络连接并且无漫游的情况下更新数据; 选择兼容的数据格式,把含有文本数据和二进制数据的请求全部转化成二进制数据格式请求; 使用高效的转换工具,多考虑使用流式转换工具,少用树形的转换工具; 为了更快的用户体验,请减少重复访问服务器的操作; 如果可以的话,请使用framework的GZIP库来压缩文本数据以高效使用CPU资源。 建议六:怎么优化应用在前端的工作 如果考虑使用wakelocks,尽量设置为最小的级别; 为了防止潜在的bug导致的电量消耗,请明确指定超时时间; 启用 android:keepScreenOn属性; 除了系统的GC操作,多考虑手动回收Java对象,比如XmlPullParserFactory和BitmapFactory。还有正则表达式的Matcher.reset(newString)操作、StringBuilder.setLength(0)操作; 要注意同步的问题,尽管在主线程中是安全的; 在Listview中要多采用重复利用策略; 如果允许的话多使用粗略的网络定位而不用GPS,对比一下GPS需要1mAh(25s * 140 mA),而一般网络只用0.1mAh(2s * 180mA); 确保注销GPS的位置更新操作,因为这个更新操作在onPause()中也是会继续的。当所有的应用都注销了这个操作,用户可以在系统设置中重新启用GPS而不浪费电量; 请考虑在大量数理运算中使用低精度变量并在用DisplayMetrics进行DPI任务时缓存变量值; 建议七:怎么优化工作在前台的应用 请确保service生命周期都是短暂的,因为每个进程都需要2MB的内存,而在前台程序需要内存时也会重新启动; 保持内存的使用量不要太大; 如果要应用每30分钟更新一次,请在设备处于唤醒状态下进行; Service在pull或者sleep状态都是不好的,这就是为什么在服务结束时要使用AlarmManager或者配置属性stopSelf()的原因。 建议八:其它注意事项 在进行整体更新之前检查电池的状态和网络状态,等待最好的状态在进行大幅度装换操作; 让用户看到用电情况,比如更新周期,后台操作的时候; 实现低内存占用UI 建议九:怎么找到布局显示问题 当我们为布局单独创建UI的时候,就是在创建滥用内存的App,它在UI中会出现可恶的延时。要实现一个流畅的、低内存占用的UI,第一步就是搜索 你的应用找出潜在的瓶颈布局。使用Android SDK/tools/中自带的Hierarchy Viewer Tool工具。 还有一个很好的工具就是Lint,它会扫描应用的源码去寻找可能存在的bug,并为控件结果进行优化。 建议十:如何解决问题 如果布局显示结果发现了问题,你可以考虑简化布局结构。可以把LinearLayout类型转化成RelativeLayout类型,降低布局的层级结构。 做到更加完美并不断优化 尽管以上的每条建议看起来都是很小的改进,但是如果它能成为你日常代码的一部分,那么你就会看到意想不到的结果。要让Google Play看到更多杰出的、流畅的、更快速、更省电的应用,向Android走向完美的目标迈进一步。 原文链接: azoft   翻译: 伯乐在线 – chris 译文链接: http://blog.jobbole.com/64279/ from:http://www.oschina.net/news/50413/android-application-development-tips

龙生   04 Apr 2014
View Details

Android中退出程序的提示框

@Override     public boolean onKeyDown(int keyCode, KeyEvent event) {         if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {             dialog();             return true;         }         return true;     } protected void dialog() {         AlertDialog.Builder builder = new Builder(AccoutList.this);         builder.setMessage("确定要退出吗?");         builder.setTitle("提示");         builder.setPositiveButton("确认",         new android.content.DialogInterface.OnClickListener() {             @Override             public void onClick(DialogInterface dialog, int which) {                 dialog.dismiss();                 //AccoutList.this.finish();                 //System.exit(1);                 android.os.Process.killProcess(android.os.Process.myPid());             }         });         builder.setNegativeButton("取消",         new android.content.DialogInterface.OnClickListener() {             @Override             public void onClick(DialogInterface dialog, int which) {                 dialog.dismiss();             }         });         builder.create().show();     }   from:http://blog.csdn.net/jumping_android/article/details/7571309

龙生   19 Feb 2014
View Details

Android里面如何编写退出主程序的提示代码

在Android的手机里面,有个返回按键,通过返回按键,用户可以返回上一层的Activity, 又或者可以直接退出程序。这样,就给用户带来一个新的问题,当用户正在做着一些非常重要的事情的时候,比如浏览文件、或者是在编辑重要的数据的时候,不小心按了返回键,如果 当前的Activity正好是处于最外一层的时候,如果没有给按键定义一个退出的按钮的时候。用户可能通过返回按键就直接退出了整个程序,从而导致了一些 用户使用上的不必要而且可以避免的不愉快的事情发生。 那么,在整个程序退出的时候,如何做到提示的作用呢?我们希望做到的是,当用户要退出整个程序的时候,程序给出一个提示按钮,等用户再次确认后才退出。 现在,先看看如何编写退出程序的提示对话框。程序会用到AlertDialog 这个类,在这个类里面,当用户选择返回键的时候,会有两个按钮,一个是“确定”,一个是“取消”。为了响应事件,需要编写事件响应函数AlterDialog.setPositiveButton(int textId, DialogInterface.OnClickListener listener). –  textId, 要显示给用户看的资源或者文本 –  listener, 是用户单击“确定”或者“取消”按钮所响应的时间 当用户选择“确定”,就退出当前的对话框。其中,有个很重要的函数,Activity.finish(),通过调用这个函数,退出当前运行的整个Android程序。当用户选择“取消”的时候,只要单纯的retuan,即可返回主程序。可以定义一个showTips()的专用方法在main Activity里面,那么每次我们写的时候,就调用这个函数的就可以了。 private void showTips() {         AlertDialog alertDialog = new AlertDialog.Builder(this)                 .setTitle("退出程序").setMessage("是否退出程序")                 .setPositiveButton("确定", new DialogInterface.OnClickListener() {                     public void onClick(DialogInterface dialog, int which) {                         finish();                     }                 }).setNegativeButton("取消",                 new DialogInterface.OnClickListener() {                     public void onClick(DialogInterface dialog, int which) {                         return;                     }                 }).create(); // 创建对话框         alertDialog.show(); // 显示对话框     } 那么,在哪里调用这个提示的方法呢?应该找到的是返回按键的响应时间,也就是函数Activity. onKeyDown(int keyCode, KeyEvent event) 函数里面响应事件的发生。 public boolean onKeyDown(int keyCode, KeyEvent event) {         if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {             showTips();             return false;         }         return super.onKeyDown(keyCode, event);     } 至此,通过复写onKeyDown函数,当用户单击返回的按钮的时候,就会弹出提示的对话框,可以有效地防止用户由于失误引起的不必要的退出。注意:强按Home键,一样可以退出应用,避开了提示框,这个方法只适合按返回键。 from:http://blog.chinaunix.net/uid-25885064-id-3386463.html

龙生   19 Feb 2014
View Details