Chinaunix首页 | 论坛 | 博客
  • 博客访问: 62008
  • 博文数量: 23
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 245
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-22 18:45
个人简介

一个现在有点想法的IT民工

文章分类
文章存档

2015年(1)

2014年(6)

2011年(4)

2010年(5)

2008年(1)

2007年(6)

我的朋友

分类: Android平台

2014-01-15 16:06:35

1. BroadCastRceiver 对象执行完onReceive()后会很快被系统回收或者只留着对象的引用但里面的成员变量部分或全部已被回收,可能静态注册或动态注册都是这样。至少动态注册肯定是这样,在receiver对象内部声明一个mHandler成员变量,用它来做延时,以去除短时间内重复消息,发现有时失灵:因为mHandler被回收,又重建,重建的handler的消息和原先的handler的消息没有关系了(属于不同的handler对象),用remove不了原先的。

* 2. 放在res/raw下面的资源文件在编译生成apk包时,根据文件类型有些文件是不被压缩的。比如.ogg,但有时候需要给不同的渠道打不同的包(包含不同的渠道id),这时候会先把apk文件解压,将渠道号写入assert/channel中,然后再用zip工具重新压缩成apk文件,就出现问题:原来不被压缩的资源文件(如.ogg)被压缩了,安装后使用就会crash:日志:
Caused by: android.content.res.Resources$NotFoundException: File res/raw/zxing_beep_voice.ogg from drawable resource ID #0x7f050000
01-27 15:48:35.661: W/System.err(19012):  at android.content.res.Resources.openRawResourceFd(Resources.java:1039)
01-27 15:48:35.661: W/System.err(19012):  at com.sogou.upd.ZXing.BeepManager.buildMediaPlayer(BeepManager.java:111)
01-27 15:48:35.661: W/System.err(19012):  at com.sogou.upd.ZXing.BeepManager.updatePrefs(BeepManager.java:64)
01-27 15:48:35.661: W/System.err(19012):  at com.sogou.upd.ZXing.BeepManager.(BeepManager.java:51)
01-27 15:48:35.661: W/System.err(19012):  at com.sogou.upd.ZXing.CaptureActivity.onCreate(CaptureActivity.java:134)
01-27 15:48:35.661: W/System.err(19012):  at android.app.Activity.performCreate(Activity.java:5220)
01-27 15:48:35.661: W/System.err(19012):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1086)
01-27 15:48:35.661: W/System.err(19012):  at com.lbe.security.service.core.client.b.x.callActivityOnCreate(Unknown Source)
01-27 15:48:35.661: W/System.err(19012):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2171)
01-27 15:48:35.661: W/System.err(19012):  ... 11 more
01-27 15:48:35.661: W/System.err(19012): Caused by: java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed
01-27 15:48:35.661: W/System.err(19012):  at android.content.res.AssetManager.openNonAssetFdNative(Native Method)
01-27 15:48:35.666: W/System.err(19012):  at android.content.res.AssetManager.openNonAssetFd(AssetManager.java:428)
01-27 15:48:35.666: W/System.err(19012):  at android.content.res.Resources.openRawResourceFd(Resources.java:1036)
01-27 15:48:35.666: W/System.err(19012):  ... 19 more
所以最好在写渠道号脚本时注意:不要把所有文件都压缩了。具体原理可参见以下链接:
http://ponystyle.com/blog/2010/03/26/dealing-with-asset-compression-in-android-apps/

一般用aapt工具打包,示例代码如下:
 path=$1
  2 appversion=$2
  3 pid=$3
  4 destfile=$4
  5 cd $path
  6 if [ -x $path/tmp$pid ]
  7 then
  8     rm -rf $path/tmp$pid
  9 fi
 10 mkdir -p $path/tmp$pid/assets
 11 cp appversions/$appversion $path/tmp$pid/
 12 cd $path/tmp$pid
 13 echo $pid>assets/channel
 14 aapt r $appversion assets/channel
 15 aapt a $appversion assets/channel
 16 jarsigner -verbose -keystore "../sogou-upd-android.keystore" -storepass "bj-upd-sogou" -signedjar $destfile $appversion "upd"
 17 cd ..
 18
 19 if [ ! -x apk ]
 20 then
 21         mkdir apk
 22 fi
 23 if [ ! -x apk/$(date +%Y%m) ]
 24 then
 25         mkdir apk/$(date +%Y%m)
 26 fi
 27 if [ ! -x apk/$(date +%Y%m)/$(date +%d) ]
 28 then
 29         mkdir apk/$(date +%Y%m)/$(date +%d)
 30 fi
 31 mv tmp$pid/$destfile apk/$(date +%Y%m)/$(date +%d)
 32 rm -rf tmp$pid 

2014.5.20
singleInstance的activity A不能以startActivityForResult()方式启动其他activity B,测试发现,将A启动模式改成singleTask,可以以startActivityForResult()方式启动B,但将B启动模式改成singleInstance,则A又不能以这种方式启动  B。若A,B为正常模式,但A启动B时指定NEW_TASK标志,则A不能以startActivityForResult()方式启动B,但若A, B为正常模式,但指定不同的taskAffinity,则A可以startForResult方式启动B。所以也不是说A,B不在一个task中就不行。
阅读(1875) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~