一、开机自启动 二、系统服务(须要用到AIDL进行数据传输);拿到需求的第一步准备下手的是开机自启动。java
1、开机自启动android
这里要分三步走:服务器
第一步:加入开机自启动权限app
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>ide
第二步:注册广播接收器this
<receiver android:name=".MyReceiver">
<intent-filter android:priority="4000">
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>spa
android:priority是启动优先级,值越大优先级越高,因此这里根据本身的状况而定。code
MyReceiver源码xml
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { Log.i(StbService.TAG, "boot receiver"); Intent i = new Intent(context, StbService.class); context.startService(i); } } }
第三步:将当前当前应用生成的apk复制到system/app下,若是含有.so文件,须要复制到system/lib目录下。有不少平台开机自启动不须要将应用复制到system/app下,直接安装就能够,blog
这个具体缘由不清楚。
以上三步就是实现开机自启动的步骤。
2、搭建系统服务一个完整的系统服务
须要分为通讯AIDL、服务器端、客户端
一、建立你要传递数据的AIDL文件
AIDL是android接口定义语言,经常使用于进程间通讯,它是一种轻量级通讯语言,它能传递基本的数据类型或者带基本数据类型的List,其余状况的类都须要经过
序列化。这里要注意,服务器端和客户端的AIDL文件必须同样,且必须在相同的包名下。
代码以下:
package com.konka.qosmonloader.aidl; interface IStbParmService{ String getStbParameter(String parmName); }
上面的aidl会生成相应的Binder,由于sub类实现了Binder接口,因此之后会使用这个类。
二、建立服务器端代码StbService
Stbservice.java实现以下:
public class StbService extends Service { public static final String TAG = "StbService"; private String Account = "ServerID"; public IBinder onBind(Intent intent) { return binder; } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(TAG, "StbService start"); return super.onStartCommand(intent, flags, startId); } private final IStbParmService.Stub binder = new IStbParmService.Stub() { public static final String TAG = "IRemoteService.Stub"; @Override public String getStbParameter(String parmName) throws RemoteException { String parmValue = ""; if ("Account".equals(parmName)) { parmValue = Account; // 业务帐号。 } return parmValue; } }; }
对应的服务器端清单文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.konka.qosmonloader" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <permission android:name="thomas.permission.AIDL_SERVICE"/> <uses-permission android:name="android.permission.BROADCAST_STICKY"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.konka.qosmonloader.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="com.konka.qosmonloader.StbService" android:label="StbService" android:enabled="true" android:exported="true" android:process=":remote" android:permission="thomas.permission.AIDL_SERVICE"> <intent-filter> <action android:name="com.certus.ottstb.bestv.StbParmService"/> </intent-filter> </service> <receiver android:name=".MyReceiver"> <intent-filter android:priority="4000"> <action android:name="android.intent.action.BOOT_COMPLETED" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver> </application> </manifest>
特别注意:一、须要加入权限<permission android:name="thomas.permission.AIDL_SERVICE"/> 二、自定义命名一个action,供客户端访问
我这里命名为<action android:name="com.certus.ottstb.bestv.StbParmService"/>这个名字能够随便命名,可是客户端过滤的
action必须同名。
服务器端的目录结构以下:
三、建立客户端Activity
目录结果以下:
MainActivity.java代码
public class MainActivity extends Activity { private IStbParmService myService; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent=new Intent("com.certus.ottstb.bestv.StbParmService"); this.getApplicationContext().bindService(intent, conn, BIND_AUTO_CREATE); } private ServiceConnection conn=new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub myService=null; } @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub myService=IStbParmService.Stub.asInterface(service); try { String a = myService.getStbParameter("Account"); Toast.makeText(MainActivity.this, a, Toast.LENGTH_LONG).show(); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; }
这里须要注意:注册用的action要跟前面提到的本身命名的action同样
接下来是清单文件的代码:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.aidltest" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <uses-permission android:name="thomas.permission.AIDL_SERVICE"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.aidltest.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
一样也要加入权限<uses-permission android:name="thomas.permission.AIDL_SERVICE"/>