5

特定のゲスト ワイヤレス ネットワークに自動ログインする Android 用のアプリケーションを作成しました。UI/アクティビティが表示されていない/実行されていない場合でも、このアプリケーションが動作して実行されるようにしたかったのです。

現在はうまく機能しているようですが、設計のロジスティクスに疑問を抱いています。私の質問は次のとおりです。

  • サービスも必要ですか?
  • 私のデザインは逆ですか?ブロードキャスト レシーバーはサービスを呼び出して作業を行う必要がありますか?
  • ブロードキャスト レシーバーをマニフェストに登録し、コードで呼び出す必要はありませんか?
  • startService() への複数の呼び出しは悪いですか? サービスが 1 つしか実行されていないことはわかっていますが、サービスを作成する前に、そのサービスが既に実行されているかどうかを確認するにはどうすればよいですか?

アプリケーションには 3 つのコンポーネントがあります。

  1. アクティビティ- 現在のネットワーク情報を表示するための GUI と、閉じる/「サービスを停止」ボタンがあります。
  2. サービス- このサービスが行うことは、ブロードキャスト レシーバーを登録することだけです。
  3. ブロードキャスト レシーバー- これがほとんどの作業を行います。3.

    • アクティビティの onCreate() は Context.startService() を呼び出します
    • サービス onCreate() は、通知アイコンを作成し、ブロードキャスト レシーバーを登録します。
    • ブロードキャスト レシーバーの onReceive() は、ネットワークの状態が意図的に変化したかどうかをチェックし、現在特定の SSID に接続されているかどうかをチェックし、認証済みかどうかを登録/チェックするために作成した特別なクラスを呼び出します。
4

1 に答える 1

8

サービスも必要ですか?

場合によります。BraodcastReceiver 内で行っている作業にそれほど時間がかからない場合は、そこで行うことができます。ただし、onReceive()実行時間が長すぎると、Android によって強制終了されます。一般に、BroadcastReceiver 内でネットワーク I/O を行うべきではありません。そのため、BroadcastReceiver を使用してサービスを開始するだけで、実際の作業を行うことができます。

私のデザインは逆ですか?ブロードキャスト レシーバーはサービスを呼び出して作業を行う必要がありますか?

最初の質問 (上記) に対する私の回答を参照してください。

ブロードキャスト レシーバーをマニフェストに登録し、コードで呼び出す必要はありませんか?

はい、マニフェスト<intent-filter>のタグにタグを追加できます。<receiver>これにより、適切なインテントがブロードキャストされるたびに BroadcastReceiver が自動的に開始されます。これを実現するために、アプリケーションが実行されている必要はありません。このようなもの:

    <receiver
            android:name=".MyReceiver" >
        <intent-filter>
            <action android:name="android.net.wifi.STATE_CHANGE"/>
        </intent-filter>
    </receiver>

startService() への複数の呼び出しは悪いですか? サービスが 1 つしか実行されていないことはわかっていますが、サービスを作成する前に、そのサービスが既に実行されているかどうかを確認するにはどうすればよいですか?

への複数の呼び出しstartService()は問題ありません。すでに開始されている場合は、別のものを開始しません。への呼び出しごとに、サービス内でstartService()への呼び出しが生成さonStartCommand()れます。すでに実行されているかどうかを確認したい場合はpeekService()、BroadcastReceiver から使用できます。これは、実行中の場合は を返しますIBinderが、まだ実行中でない場合は開始しません。

android.net.wifi.STATE_CHANGE: not trigger on Wifi disconnectも参照してください。

于 2012-07-20T08:38:15.410 に答える