为工厂的测试机提供一个apk,这个是边上那位写好的。测试camera一些功能,现在有新要求,针对不同机型,进行差异化配置。
两种方法(或许还有其他)load xml/json。
我更加倾向于json,小巧轻量化。
参考了CSDN上一个博客,博主未经允许不得转载,就不贴代码了。反正读取json的代码一堆,读取出来之后包括打印log时间,大概在3ms左右。
但是,有些人说:工厂分秒必争。最好是用一个service,读取数据在内存中,然后apk去load。。。。。。。
有同事修改源代码,开机启动(init.rc)。但是这样不是和原来的初衷相悖么?为了统一,用一个apk去测试,现在还专人对源代码中的这个部分进行维护,而且apk还需要源代码配合。。。。。。
========================
我的想法是在apk中启动service,然后保持service后台运行,尽量不被kill。
开始用一个本地service,被kill了。
然后开始用remote service,还是被kill
1 package com.example.FactoryTest; 2 3 interface IAsusFactoryService { 4 List<String> getJsonValue(); 5 }
一个aidl接口
1 <service android:name="com.example.FactoryTest.FactoryService" 2 android:enabled="true" 3 4 android:process=":remote" > 5 <intent-filter android:priority="1000" > 6 <action android:name="com.example.asusfactoryservice.IFactoryService" /> 7 </intent-filter> 8 </service>
xml修改
这部分参看了一些博客,还有书。太过复杂,无法列出引用(好吧,我承认是我懒,不想去翻chrome的历史记录)
1 private IFactoryService Service = null; 2 public List<String> json_data; 3 4 private Connection connection = new ServiceConnection() { 5 6 @Override 7 public void onServiceDisconnected(ComponentName name) { 8 9 } 10 11 @Override 12 public void onServiceConnected(ComponentName name, IBinder service) { 13 //Service = ((FactoryService.FactoryBinder)service).getService(); 14 Service = IFactoryService.Stub.asInterface(service); 15 16 try { 17 json_data = Service.getJsonValue(); 18 } catch (RemoteException e) { 19 // TODO Auto-generated catch block 20 e.printStackTrace(); 21 } 22 23 System.out.println(json_data.get(0).toString()); 24 System.out.println(json_data.get(1).toString()); 25 } 26 };
MainActivity中的内容,为了避免一些问题,对函数的命名做了修改。
startservice就不列出来了。
1 public class FactoryService extends Service { 2 3 public static final String TAG = "FactoryService"; 4 5 //===================================================================================== 6 public List<Map<String, String>> data; 7 private List<String> datalist = new ArrayList<String>(); 8 String model = Build.MODEL; 9 private final static String fileName = "json.txt"; 10 //===================================================================================== 11 //private final IBinder mBinder = new FactoryBinder(); 12 13 private IFactoryService.Stub serviceBinder = new IFactoryService.Stub() { 14 @Override 15 public List<String> getJsonValue() throws RemoteException { 16 return datalist; 17 } 18 }; 19 20 21 @Override 22 public void onCreate(){ 23 super.onCreate(); 24 Log.d(TAG, "onCreate executed"); 25 26 Log.v(TAG,"this is start read"); 27 new DataThread().start(); 28 29 //String jsonStr = AppJsonFileReader.getJson(getBaseContext(), fileName); 30 31 //datalist = AppJsonFileReader.setListData(jsonStr); 32 Log.v(TAG,"this is end read"); 33 } 34 35 36 @Override 37 public int onStartCommand(Intent intent, int flags, int startId) { 38 39 Log.d(TAG, "onStartCommand executed"); 40 flags = START_REDELIVER_INTENT; 41 return super.onStartCommand(intent, flags, startId); 42 } 43 44 @Override 45 public void onDestroy() { 46 47 //startService(new Intent("com.example.asusfactoryservice.IFactoryService")); 48 super.onDestroy(); 49 Log.d(TAG, "onDestory executed"); 50 } 51 52 @Override 53 public IBinder onBind(Intent intent) { 54 // TODO Auto-generated method stub 55 return serviceBinder; 56 } 57 58 /*public class FactoryBinder extends Binder { 59 60 public FactoryService getService(){ 61 Log.d(TAG, "getService executed"); 62 return FactoryService.this; 63 } 64 65 }*/ 66 67 class DataThread extends Thread { 68 @Override 69 public void run() { 70 String jsonStr = AppJsonFileReader.getJson(getBaseContext(), fileName); 71 72 datalist = AppJsonFileReader.setListData(jsonStr); 73 } 74 } 75 76 public List<String> getJsonValue() { 77 78 79 return datalist; 80 } 81 }
作为一个apk方面的小白,主要遇到以下问题:
1、aidl如何传输List<Map<String, String>>数据?用Parcelable接口?
反正我后来是用List<String>代替的。
2、在service中跑thread,和我直接去运行两行代码有多大的区别?
3、解析json的时候花了点时间研究
其实还是基础的问题,有空仔细研究以下apk的写法,这么赶鸭子上架没时间研究。
========================================================
最后,service还是被kill掉了,期间试过前台运行,开机boot运行,设置优先级等等,还是kill。。。
仔细一看发现,运行这个apk是用的一个sh脚本,脚本中每次打开apk都有am force-stop(工厂要求每次重启apk都要清理干净),吐血几升。
感觉应该有办法绕过去,暂时还没找到。临时的解决方法是在sh脚本的参数中实现差异化。