Failed to fectch URl https://dl-ssl.google.com/android/repository/addons_list.xml, reason: Connection to https://dl-ssl.google.com refused 解决办法来源于:code.google.com - 用notepad打开C:\WINDOWS\system32\drivers\etc中的hosts文件
- 在最后一行添加74.125.237.1 dl-ssl.google.com
- 成功解决问题。
|
做了几个android企业应用项目后,总结了项目的基本开发步骤,希望能够交流。 一 应用规划: ※确定功能。 ※必须的界面及界面跳转的流程。 ※需要的数据及数据的来源及格式。 ※是否需要服务端支持。 ※是否需要本地数据库支持。 ※是否需要特殊权限。 ※是否需要后台服务。 三 界面设计: ※主界面确定。 ※模块界面、列表、查看、编辑界面。 ※菜单、按钮、对话框、提示信息。 ※界面总体颜色。 四 数据操作和存储: ※数据来源。 ※数据类型。 ※存储方式。 六 页面跳转: ※每个页面间的跳转。 ※菜单、按钮、事件等。 关键字: android app, android develop, android summary 从2010.04启动该项目到现在完成主要功能模块,分享一下开发历程和注意事项。 开发环境: ubuntu7.10 + eclipse 3.5 + sdk 下面是开发总结: 1. 基于源码级的SDK以及SDK升级注意事项 o 熟悉其如何做资源国际化 o 熟悉其如何支持不同屏幕大小,不同density介质 o 熟悉其主要的API以及支持的最低版本和不被再支持的API o 了解其分层架构 o 升级SDK 确保该平台支持相关的cglib版本(否则要升级ubuntu) 简单容行的方式是remove ~/.android下的相关东西,remove先前的相关版本,再升级 部分Resources(如strings中有%s的)可能需要修改才能适应新的版本 新的sdk里可能不包括老的如2.01版本 2. Emulator & Mobile o 用adb shell 操作emulator http://www.javaeye.com/topic/260042 o push / pull file in emulator Eclipse->window->Show View->File Explorer-> pull a file from the device(or push a file onto the device) o 用 real mobile连接usb来直接测试(mobile 必须设置为develop/debug mode) http://dimitar.me/how-to-connect-your-android-phone-to-ubuntu-to-do-developmenttestinginstallations-or-tethering/ o emulator更能用于性能测试,功能测试。而mobile更适合触摸操作测试和一些View的真实展现测试 o 屏幕大小适应测试(枚举大,中,小),屏幕方向(枚举横,竖屏),任务切换测试 o 内存适应只能在mobile上做测试 3. 系统配置项 o SharedPreferences存储位置及如何在emulator上手动修改 找到存储位置: \data\data\your package dir\shared_prefs\your xml files 按照上面的pull/push the file o SQLite(sqlite3) 默认存储位置:\data\data\your package dir\databases\your database name o Other File I/O assert下文件读取 文件权限以及读写 o 解读AndroidManifest.xml application/process标识 最开始启动的activity activity栈的形式(指定taskAffinity&launchMode="singleTask"),而且转向一个新的activity是用intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)的形式 需要的权限部分 支持的最低版本 4. 基于View,Context,Manager的开发 o 系统View & Layout(Layout也是View) . 用View本身来做其他Layout间的一个分隔 . 常用的View&Layout: ListView,ScrollView,RelativeLayout,TableLayout . 设计常用的style/theme用到的Drawable: http://idunnolol.com/android/drawables.html . 常用的图片操作 . 指定颜色的渲染(setColorFilter) . 剪裁 o 自定义View & Layout . Java代码 public class TouchListView extends ListView { public TouchListView(Context context, AttributeSet attrs, int defStyle) { } } public class Toolbar extends LinearLayout { public Toolbar(final Context context) { super(context); } public Toolbar(final Context con, AttributeSet attrs) { } } activity跳转 sendBroadcast(实时数据交换可借助Thread+ BroadcastReceiver) o WindowManager 、PackageManager 等的使用 2. 网络IO o java.net o android.net o org.apache.http 如果没有让他在AsyncTask中操作,则他的TimeOut设置必须少于5秒(为ANR等待时间) java.net.UnknownHostException 如果发生在emulator,可参考: http://www.javaeye.com/topic/521023 如果发生在mobile,则一般是DNS解析问题,要么允许用户再重试操作,要么把Host的域名改为public ip address 3. 绘图部分 o 在View上绘图 只在原来View上加边框等 Java代码 @Override protected void dispatchDraw(Canvas canvas) {} @Override protected void onDraw(Canvas canvas) { Bitmap result = Bitmap.createBitmap(48,48, Config.ARGB_8888); Canvas canvas = new Canvas(result); ... canvas.drawBitmap(result, rect, rect, paint); 2. 动画 o 帧动画 控制侦速率在25FPS以让其更流畅 o 渐变动画 平移 缩放 旋转 透明 3. ANR o 构建消息以及消息循环处理Handler o 使用AsyncTask 4. Exception & UncaughtException o 使用UncaughtExceptionHandler 5. 引入第三方jar以及与其他app共享数据 o 通过add user library方式添加第三方jar o Content Provider的使用 6. 性能优化/调优 o 基于View的优化http://dl.javaeye.com/topics/download/774b3e9e-1c48-33bd-bc9d-5c27da998181 o 代码级的规范 o Method级的调优 Method Profiling(如果直接usb连接mobile,需要root权限作此项) o GC分析 使用Allocation Tracker /Files/gaolei-xj/Android_app项目开发步骤总结.pdf
原理概述: 手机电池电量的获取在应用程序的开发中也很常用,Android系统中手机电池电量发生变化的消息是通过Intent广播来实现的,常用的Intent的Action有 Intent.ACTION_BATTERY_CHANGED(电池电量发生改变时)、Intent.ACTION_BATTERY_LOW(电池电量达到下限时)、和Intent.ACTION_BATTERY_OKAY(电池电量从低恢复到高时)。 当需要在程序中获取电池电量的信息时,需要为应用程序注册BroadcastReceiver组件,当特定的Action事件发生时,系统将会发出相应的广播,应用程序就可以通过BroadcastReceiver来接受广播,并进行相应的处理。 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" 5 android:orientation="vertical" > 6 7 <Button 8 android:id="@+id/button" 9 android:layout_width="fill_parent" 10 android:layout_height="wrap_content" 11 android:text="取得电池电量" /> 12 13 </LinearLayout>
1 package org.gl.demo; 2 3 import android.app.Activity; 4 import android.content.Intent; 5 import android.content.IntentFilter; 6 import android.os.Bundle; 7 import android.view.View; 8 import android.view.View.OnClickListener; 9 import android.widget.Button; 10 11 public class MainActivity extends Activity { 12 private Button button = null; 13 14 @Override 15 public void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.main); 18 19 button = (Button) findViewById(R.id.button); 20 button.setOnClickListener(new BatteryClickListener()); 21 } 22 23 private class BatteryClickListener implements OnClickListener { 24 25 @Override 26 public void onClick(View v) { 27 BatteryBroadcastReceiver receiver = new BatteryBroadcastReceiver(); 28 IntentFilter filter = new IntentFilter( 29 Intent.ACTION_BATTERY_CHANGED); 30 MainActivity.this.registerReceiver(receiver, filter); 31 32 } 33 34 } 35 } 1 package org.gl.demo; 2 3 import android.app.AlertDialog; 4 import android.app.Dialog; 5 import android.content.BroadcastReceiver; 6 import android.content.Context; 7 import android.content.DialogInterface; 8 import android.content.Intent; 9 10 public class BatteryBroadcastReceiver extends BroadcastReceiver { 11 12 @Override 13 public void onReceive(Context context, Intent intent) { 14 if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) { 15 // 获得当前电量 16 int current = intent.getIntExtra("level", 0); 17 // 获取总电量 18 int total = intent.getIntExtra("scale", 0); 19 Dialog dialog = new AlertDialog.Builder(context) 20 .setTitle("电池电量") 21 .setMessage( 22 "电池电量为:" + String.valueOf(current * 100 / total) 23 + "%") 24 .setNegativeButton("关闭", 25 new DialogInterface.OnClickListener() { 26 27 @Override 28 public void onClick(DialogInterface dialog, 29 int which) { 30 31 } 32 }).create(); 33 dialog.show(); 34 } 35 36 } 37 38 } 39
自己最近在找工作,一直在修改简历。 1、要仔细检查已成文的个人简历,绝对不能出现错别字、语法和标点符号方面的低级错误。最好让文笔好的朋友帮你审查一遍,因为别人比你自己更容易检查出错误 2、个人简历最好用A4标准复印纸打印, 字体最好采用常用的宋体或楷体,尽量不要用花里呼哨的艺术字体和彩色字, 排版要简洁明快,切忌标新立异,排的象广告一样。当然,如果你应聘的是排版工作则是例外。 3、要记住你的个人简历必须突出重点,它不是你的个人自传,与你申请的工作无关的事情要尽量不写,而对你申请的工作有意义的经历和经验绝不能漏掉。 4、要保证你的简历会使招聘者在30秒之内,即可判断出你的价值,并且决定是否聘用你。 5、你的个人简历越短越好,因为招聘人没有时间或者不愿意花太多的时间阅读一篇冗长空洞的个人简历。最好在一页纸之内完成,一般不要超过两页。 6、要切记不要仅仅寄你的个人简历给你应聘的公司,附上一封简短的应聘信,会使公司增加对你的好感。否则,你成功的几率将大大降低。 7、要尽量提供个人简历中提到的业绩和能力的证明资料,并作为附件附在个人简历的后面。一定要记住是复印件,千万不要寄原件给招聘单位,以防丢失。 8、一定要用积极的语言,切忌用缺乏自信和消极的语言写你的个人简历。 最好的方法是在你心情好的时候编写你的个人简历。 9、不能凭空编造你的经历,说谎永远是卑鄙的,没有哪个公司会喜欢说谎的员工,但也没有必要写出所有你真实的经历。对你求职不利的经历你可忽略不写。 10、要组织好个人简历的结构,不能在一个个人简历中出现重复的内容。让人感到你的个人简历条理清楚,结构严谨是很重要的。 11、最好用第三人称写你的个人简历,不要在个人简历中出现“我”的字样。 12、你的个人经历顺序应该从现在开始倒过去叙诉,这样可使招聘单位在最短的时间内了解你最近的经历。 13、在结构严谨的前提下,要使你的个人简历富有创造性,使阅读者能产生很强的阅读兴趣。 14、遣词造句要精雕细磨,惜墨如金。尽量用简练又简练的语言。
我的观点:其实简历上面是可以适当的吹下牛,尤其在你的工作经验方面,公司主要看的就是 你的工作经验,做的项目。看你能不能给公司带来利益。简历只是一个面试的机会,有了机会我们才能把握。此贴献给找正在工作的童鞋!!!!
1.java.net.SocketTimeoutException这个异常比较常见,socket超时。一般有2个地方会抛出这个,一个是connect的时候,这个超时参数由connect(SocketAddress endpoint, int timeout)中的后者来决定,还有就是setSoTimeout(int timeout),这个是设定读取的超时时间。他们设置成0均表示无限大。 ----------------------------------------------------------------------------------------------------- 2.java.net.BindException:Address already in use:JVM_Bind
该异常发生在服务器端进行new ServerSocket(port)或者socket.bind(SocketAddress bindpoint)操作时。 原因:与port一样的一个端口已经被启用,并进行监听。 此时用netstat -an 命令,可以看到一个Listening状态的端口。 只需要找到一个没有被占用的端口就能解决这个问题。 ------------------------------------------------------------------------------------------------------ 3.java.net.ConnectException:Connection refused:connect
该异常发生在客户端进行new Socket(ip, port)或者socket.connect(address, timeout)操作时。 原因:指定ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由), 或者是该ip存在,但找不到指定的端口进行监听。应该首先检查客户端的ip和port 是否写错了,假如能ping通(服务器端把ping禁掉则需要另外的方法),则看在服务器端的 监听指定端口的程序是否启动。 -------------------------------------------------------------------------------------------------------- 4.java.net.SocketException:Socket is closed 该异常在客户端和服务器端均可能发生。异常的原因是己方主动关闭了连接后 (调用了Socket的close方法)再对网络连接进行读写操作。 ------------------------------------------------------------------------------ 5.java.net.SocketException: Connection reset或者Connect reset by peer:Socket write error 该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是假如一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关闭), 另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。另一个是一端退出,但退出时并未关闭该连接,另一端假如在从连接中读数据则抛出该异常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。 对于服务器,一般的原因可以认为: a) 服务器的并发连接数超过了其承载量,服务器会将其中一些连接主动Down掉. b) 在数据传输的过程中,浏览器或者接收客户端关闭了,而服务端还在向客户端发送数据。 ---------------------------------------------------------------------------- 6.java.net.SocketException: Broken pipe 该异常在客户端和服务器均有可能发生。在抛出SocketExcepton:Connect reset by peer:Socket write error后,假如再继续写数据则抛出该异常。前两个异常的解决方法是首先确保程序退出前关闭所有的网络连接,其次是要检测对方的关闭连接操作,发现对方 关闭连接后自己也要关闭该连接。 对于4和5这两种情况的异常,需要特别注意连接的维护。在短连接情况下还好,如果是长连接情况,对于连接状态的维护不当,则非常容易出现异常。基本上对长连接需要做的就是: a) 检测对方的主动断连(对方调用了Socket的close方法)。因为对方主动断连,另一方如果在进行读操作,则此时的返回值是-1。所以一旦检测到对方断连,则主动关闭己方的连接(调用Socket的close方法)。 b) 检测对方的宕机、异常退出及网络不通,一般做法都是心跳检测。双方周期性的发送数据给对方,同时也从对方接收“心跳数据”,如果连续几个周期都没有收到对 方心跳,则可以判断对方或者宕机或者异常退出或者网络不通,此时也需要主动关闭己方连接;如果是客户端可在延迟一定时间后重新发起连接。虽然Socket 有一个keep alive选项来维护连接,如果用该选项,一般需要两个小时才能发现对方的宕机、异常退出及网络不通。 ---------------------------------------------------------------------------------------------- 7.java.net.SocketException: Too many open files 原因: 操作系统的中打开文件的最大句柄数受限所致,常常发生在很多个并发用户访问服务器的时候。 因为为了执行每个用户的应用服务器都要加载很多文件(new一个socket就需要一个文件句柄),这就会导致打开文件的句柄的缺乏。 解决方式: a) 尽量把类打成jar包,因为一个jar包只消耗一个文件句柄,如果不打包,一个类就消耗一个文件句柄。 b) java的GC不能关闭网络连接打开的文件句柄,如果没有执行close()则文件句柄将一直存在,而不能被关闭。 也可以考虑设置socket的最大打开 数来控制这个问题。对操作系统做相关的设置,增加最大文件句柄数量。ulimit -a可以查看系统目前资源限制,ulimit -n 10240则可以修改,这个修改只对当前窗口有效。
摘要: Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ 复制当前行到上一行(复制增加)Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)Alt+↑ 当前行和上面一行交互位置(同上)Alt+← 前一个编辑的页... 阅读全文
简短说明(Quick explanation): 通过创建BroadcastReceiver来侦测系统中有关电池Intent(ACTION_BATTERY_CHANGED)的变化,一旦有接收到相关事件,将会读取当前电量情况,并通过TextViews显示在当前屏幕。 1 public class MyButteryDemo extends Activity { 2 private Button button = null; 3 4 @Override 5 public void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.main); 8 9 button = (Button) findViewById(R.id.btn); 10 button.setOnClickListener(new OnClickListenerImpl()); 11 } 12 13 private class OnClickListenerImpl implements OnClickListener { 14 15 @Override 16 public void onClick(View arg0) { 17 ButteryBroadcastReceiver receiver = new ButteryBroadcastReceiver(); 18 IntentFilter filter = new IntentFilter( 19 Intent.ACTION_BATTERY_CHANGED); 20 MyButteryDemo.this.registerReceiver(receiver, filter); 21 } 22 23 } 24 } 1 public class ButteryBroadcastReceiver extends BroadcastReceiver { 2 3 @Override 4 public void onReceive(Context context, Intent intent) { 5 6 if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) { 7 int level = intent.getIntExtra("level", 0); 8 int scale = intent.getIntExtra("scale", 100); 9 Dialog dialog = new AlertDialog.Builder(context) 10 .setTitle("电池电量") 11 .setMessage( 12 "电池电量为:" + String.valueOf(level * 100 / scale) 13 + "%").setNegativeButton("关闭", new DialogInterface.OnClickListener() { 14 15 @Override 16 public void onClick(DialogInterface dialog, int which) { 17 // TODO Auto-generated method stub 18 19 } 20 }).create(); 21 dialog.show(); 22 } 23 } 24 25 }
开机启动Receiver
1 public void onReceive(Context context, Intent intent) {
2 String action = intent.getAction();
3 if(Intent.ACTION_BOOT_COMPLETED.equals(action)) {
4 Intent serviceIntent = new Intent();
5 serviceIntent.setClass(context, BcsService.class);
6 context.startService(serviceIntent);
7 }
8 }
开机和网络连接时启动Receiver 1 @Override 2 public void onReceive(Context context, Intent intent) { 3 String action = intent.getAction(); 4 if(Intent.ACTION_BOOT_COMPLETED.equals(action) || 5 ConnectivityManager.CONNECTIVITY_ACTION.equals(action)) { 6 Intent serviceIntent = new Intent(); 7 serviceIntent.setClass(context, BcsService.class); 8 context.startService(serviceIntent); 9 } 10 }
1 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 2 // sd card 可用 3 }else { 4 // 当前不可用 5 }
|
|
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
30 | 31 | 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 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|
常用链接
留言簿
随笔分类
随笔档案
文章分类
搜索
最新评论

阅读排行榜
评论排行榜
|
|