解决android.content.res.Resources NotFoundException的一个方法

android开发中会用一些资源,这些资源以不同形式存在,比如说图片,xml等,android为这些不同类型的资源统一编号,生成资源类R
。如下:

public final class R {
public static final class anim {
public static final int popup_enter=0x7f040000;
public static final int popup_exit=0x7f040001;
}
public static final class drawable {
public static final int gradient_bg=0x7f020000;
public static final int icon=0x7f020001;
}
public static final class layout {
public static final int city_item=0x7f030000;
}
}

在编译器编译程序时可以找到的资源,但在运行时却找不到,会出现如下异常:
12-14 01:40:58.452: WARN/AppWidgetHostView(627): android.content.res.Resources$NotFoundException: Resource ID #0x7f030000
出现此类异常时,可以根据 Resource ID到资源类R中找相关的资源。比如0x7f030000,对应的是city_item布局文件,就可以将问题缩小到更小的范围。对于这类运行时找不到资源,但资源又确实存在的问题,可能的编译打包时出现问题,没有将该资源加入。可修改一下该资源,让编译器重新编译。

继续阅读解决android.content.res.Resources NotFoundException的一个方法

Android中如何自定义Menu菜单

我们又如何来自定义Menu呢?下面我就主要来讲讲如何在Android上自定义Menu菜单,希望对大家有所帮助。

用过UCWEB-Android版的人都应该对其特殊的menu有印象,把menu做成Tab-Menu(支持分页的Menu),可以容纳比 Android传统的menu更丰富的内容(Android的menu超过6项则缩略在[更多]里),本文参考网上的例子(作 者:CoffeeCole,email:longkefan@foxmail.com),对例子进行简化以及封装,使其作为一个复合控件融入自己的 framework。 继续阅读Android中如何自定义Menu菜单

高版本apk运行在android 1.5上出现的问题及解决方法

当采用高版本SDK开发的Android应用,更换成1.5的SDK后会出现如下错误,说是一些资源文件找不到。但这个资源文件又是你程序中从来没有用到的。

java.io.FileNotFoundException: res/drawable/title_bar_shadow.9.png

Caused by: android.content.res.Resources$NotFoundException: File res/drawable/title_bar_shadow.9.png from drawable resource ID #0x7f020001

Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class java.lang.reflect.Constructor

经查发现,是sdk1.5版本和高版本的sdk创建的工程的目录结构不同,高版本的考虑到不同分辨率,所以有drawable-ldpi, drawable-mdpi, drawable-hdpi。而sdk1.5及以下没有种结构。只的drawable一个文件夹。用SDK1.5有时可以编辑通过高版本sdk创建的应用工程,但在1.5的机器上运行时不能从指定的drawable中找到相关资源所以不能运行。

知道问题所在后解决就很容易了,在工程中加上drawable资源文件夹,将drawable-ldpi, drawable-mdpi, drawable-hdpi中的相应资源加入到drawable中,再次编译就可以运行了。

参考:http://codinganswers.info/index.php/2011/07/exception-while-running-my-app-targetsdk-2-2-api-level-8-running-on-1-5-api-level-3/

采用XMPP协议向android客户端推送消息

XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。

androidpn是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。经过源代码研究我发现,该服务器端基本是在另外一个开源工程openfire基础上修改实现的,不过比较郁闷的是androidpn的文档是由韩语写的,所以整个研究过程基本都是读源码。它的实现示意图如下:

androidpn客户端需要用到一个基于java的开源XMPP协议包asmack,这个包同样也是基于openfire下的另外一个开源项目smack,不过我们不需要自己编译,可以直接把androidpn客户端里面的asmack.jar拿来使用。客户端利用asmack中提供的XMPPConnection类与服务器建立持久连接,并通过该连接进行用户注册和登录认证,同样也是通过这条连接,接收服务器发送的通知。

androidpn服务器端也是java语言实现的,基于openfire开源工程,不过它的Web部分采用的是spring框架,这一点与openfire是不同的。Androidpn服务器包含两个部分,一个是侦听在5222端口上的XMPP服务,负责与客户端的XMPPConnection类进行通信,作用是用户注册和身份认证,并发送推送通知消息。另外一部分是Web服务器,采用一个轻量级的HTTP服务器,负责接收用户的Web请求。服务器架构如下:

最上层包含四个组成部分,分别是SessionManager,Auth Manager,PresenceManager以及Notification Manager。SessionManager负责管理客户端与服务器之间的会话,Auth Manager负责客户端用户认证管理,Presence Manager负责管理客户端用户的登录状态,NotificationManager负责实现服务器向客户端推送消息功能。

服务器端界面如下,分别对应了上述的几个功能模块:

发送以后,我们可以在手机端看到接收的消息:

这个解决方案的最大优势就是简单,我们不需要象C2DM那样依赖操作系统版本,也不会担心某一天Google服务器不可用。利用XMPP协议我们还可以进一步的对协议进行扩展,实现更为完善的功能。

采用这个方案,我们目前只能发送文字消息,不过对于推送来说一般足够了,因为我们不能指望通过推送得到所有的数据,一般情况下,利用推送只是告诉手机端服务器发生了某些改变,当客户端收到通知以后,应该主动到服务器获取最新的数据,这样才是推送服务的完整实现。

相关资料:

谷歌Android如何从云端推送消息到手机

How to Implement Push Notifications for Android

提高Android应用程序的速度四大原则

我们之前曾向大家介绍了过《Android应用核心——Intent》。Intent可以算得上Android应用开发的重点之一,它负责对应用中各个组件之间的通讯与相互协调和调用。但是在Android开发中,对Android应用程序提速需要很多技巧和原则。首先, 我们要先明白“加快”是有两层意思的,第一层是代码执行所需要的时间,第二层意思是用户需要等待用户界面响应的时间。这两者有很大的不同,当然我们必须提高代码执行的效率,但是最重要的是用户所看到的东西。所以,如果不是必须的,就不要让用户等待。下面是提高Android应用程序运行速度的几条原则。

继续阅读提高Android应用程序的速度四大原则

Android中ListView组件的Item拖动(Item改变顺序)

http://blog.csdn.net/mayingcai1987/archive/2011/04/25/6362325.aspx

  1. /*
  2. * Copyright (C) 2008 The Android Open Source Project
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the “License”);
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. *      http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an “AS IS” BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */ 继续阅读Android中ListView组件的Item拖动(Item改变顺序)

分辨率相关DPI,SIZE,RESOLUTION,COLOR,DENSITY

  1. Screen size (屏幕尺寸):具体的屏幕物理长度,以对角线长度做为标识,平时我们说的3”屏,7”屏就是指这个,是物理尺寸
  2. Resolution (分辨率):屏幕上总共的物理像素点,虽然经常被以800X600之类的来描述,但是在android中,他并不指代具体的屏幕宽高比例,注意,分辨率和屏幕大小没有任何联系,分辨率只是描述点的而已,所以相同分辨率下,屏幕越小,越清晰
  3. 继续阅读分辨率相关DPI,SIZE,RESOLUTION,COLOR,DENSITY

android监听WIFI开启与关闭

public class WIFIReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
//监听WIFI状态变化
if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
WifiManager wifiManager = (WifiManager) context
.getSystemService(Context.WIFI_SERVICE);
Log.e(“Debug”, “Setting wifistate: ” + wifiManager.getWifiState());
} else if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
////监听连接状态的变化莫测
NetworkInfo networkInfo = intent
.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
Log.e(“Debug”, “Setting isConnected: ” + networkInfo.isConnected());
if (networkInfo.isConnected())
Toast.makeText(context, “Connected!”, Toast.LENGTH_LONG).show();
}
}
}