2012-12-10 77 views
1

我正在嘗試創建一個在系統服務器之外運行的Java服務,它將從啓動啓動,它基於配置可以監控Android設備並偵聽廣播。我一直無法找到關於如何編寫長時間運行的java服務的文檔,該服務作爲zygote未啓動的進程運行。我正在嘗試修改平臺,並將此服務添加到通過重建Android源代碼生成的自定義system.img中。從Java服務訪問Android上下文

該服務將啓動類似於用於從adb運行am的腳本。

base=/system 
export CLASSPATH=$base/framework/am.jar 
exec app_process $base/bin com.android.commands.am.Am "[email protected]" 

,我發現嘗試添加守護進程的唯一的例子已經充分執行該設備上運行native services

Embedded Android描述了Android用戶空間和一些運行在那裏的本機守護程序,以及如何創建服務並將它們添加到init以便在設備引導時啓動,至少在Zygote和System Server之前。

public class Monitor{ 
    public static void main(String [] args){ 
     new Monitor.run(); 
    } 
    public void run(){ 
     Application app = new Application(); 
     Context con = app.getApplicationContext(); 
     BroadcastReceiver receiver = new BroadcastReceiver(){ 
      public void onReceive(Context context, Intent intent){ 
       Log.i(TAG, "Received intent:"+ intent.getAction()); 
      } 
     } 
     IntentFilter filter = new IntentFilter("android.intent.action.TIME_TICK") 
    } 
} 

我也根據ActivityManagerService中的一段代碼嘗試過。 public class Monitor { private Context mContext;

Monitor(){ 
     Looper.prepare() 
     ActivityThread at = ActivityThread.systemMain(); 
     mContext = at.getSystemContext(); 
    } 
    public static void main(String [] args){ 
     new Monitor.run(); 
    } 
    public void run(){ 
     BroadcastReceiver receiver = new BroadcastReceiver(){ 
      public void onReceive(Context context, Intent intent){ 
       Log.i(TAG, "Received intent:"+ intent.getAction()); 
      } 
     } 
     IntentFilter filter = new IntentFiler("android.intent.action.AIRPLANE_MODE"); 
     mContext.registerReceiver(receiver,filter); 
    } 
} 

我可以使用adb和am從命令行生成意圖/廣播,但是無論如何都可以接收廣播。任何意見或建議表示讚賞。

回答

0

活動管理器有防止non_Apps/Zygote進程接收Android內廣播的代碼。結束了使用不同的方法來滿足我自己的需求。

public Intent registerReceiver(IApplicationThread caller, String 
callerPackage, 
     IIntentReceiver receiver, IntentFilter filter, String 
permission, int userId) { 
    enforceNotIsolatedCaller("registerReceiver"); 
... 
}