2

システムサーバーの外部で実行され、起動から開始されるJavaサービスを作成しようとしています。このサービスは、構成に基づいてAndroidデバイスを監視し、ブロードキャストをリッスンできます。zygoteによって開始されないプロセスとして実行される長時間実行されるJavaサービスを作成する方法に関するドキュメントを見つけることができませんでした。プラットフォームを変更しようとしていますが、このサービスは、Androidソースを再構築して生成されたカスタムsystem.imgに追加されます。

サービスは、amをadbから実行するために使用されるスクリプトと同様に開始されます。

base=/system
export CLASSPATH=$base/framework/am.jar
exec app_process $base/bin com.android.commands.am.Am "$@"

デーモンを追加しようとして私が見つけた唯一の例は、デバイス上で実行される完全にネイティブなサービスを実装することでした。

組み込みAndroidでは、Androidユーザースペースとそこで実行されるいくつかのネイティブデーモン、およびサービスを作成してinitに追加し、少なくともZygoteとシステムサーバーなどの前にデバイスの起動時に開始する方法について説明します。

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を使用してコマンドラインから生成できますが、とにかくブロードキャストを受信するためにあります。任意のアドバイスや提案をいただければ幸いです。

4

1 に答える 1

0

アクティビティマネージャーには、non_Apps/ZygoteプロセスがAndroid内でブロードキャストを受信しないようにするコードがあります。私自身のニーズを満たすために別のアプローチを使用することになりました。

public Intent registerReceiver(IApplicationThread caller, String 
callerPackage, 
        IIntentReceiver receiver, IntentFilter filter, String 
permission, int userId) { 
    enforceNotIsolatedCaller("registerReceiver"); 
... 
} 
于 2013-01-23T19:57:51.363 に答える