为安卓apk添加服务

为工厂的测试机提供一个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脚本的参数中实现差异化。

转载于:https://www.cnblogs.com/bugtags/articles/4766945.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值