0

これはもっと疑問です。現在、私のコードは正常に動作していますが、正しい方法で実行していることを確認したいと考えています。

アクティビティがフォアグラウンドで実行されているかどうかをチェックするサービスがあります。そうである場合は、アクティビティにブロードキャストを送信するため、アクティビティは画面上のいくつかのものを更新します。

サービスで作成しIntentFilterました:

com.harkdev.ServerStatus.SERVER_UPDATED

ここで、サービスはアクティビティがフォアグラウンドにあるかどうかを知る必要があるためIsActivityRunning()、実行中のタスクを から読み取る メソッドを使用しApplicationManagerます。これは、GET_TASKS許可を設定する必要があることを意味します。

SERVICE と ACTIVITY の両方が同じパッケージに含まれているため、この情報を取得するより良い方法はありますか?? そして、GET_TASKSパーミッションの設定を避けてみてください??

これは私のサービスのコードです:

if (IsActivityRunning()) {
    Intent localIntent = new Intent(SERVER_UPDATED);
    SendBroadcast(localIntent, null);
}

IsActivityRunning()メソッド:

public bool IsActivityRunning() {
    ActivityManager manager = (ActivityManager) GetSystemService(ActivityService);
    IList<ActivityManager.RunningTaskInfo> runningTaskInfo = manager.GetRunningTasks(1); 

    ComponentName componentInfo = runningTaskInfo[0].TopActivity;
    if (componentInfo.PackageName == "com.harkdev.ServerStatus") 
        return true;

    return false;
}

そして、これは私の活動のコードです:

protected override void OnCreate (Bundle bundle) {
    base.OnCreate(bundle);
    // Set our view from the "main" layout resource
    SetContentView (Resource.Layout.Main);

    IntentFilter filter = new IntentFilter(ServerStatusCheckService.SERVER_UPDATED);
    _receiver = new ServiceBroadcastReceiver ();
    _receiver.Received += Receiver_Received;

    RegisterReceiver(_receiver, filter);
}
4

1 に答える 1

3

まず、文字列を比較する方法が間違っています。

if (componentInfo.PackageName == "com.harkdev.ServerStatus")

そのはず:

if ("com.harkdev.ServerStatus".equals(componentInfo.PackageName))

第二に、サービスとアクティビティがアプリ内にある場合、「同じパッケージ」をチェックする必要はないと思います。

サービスからアクティビティに情報を送信するには、次を使用できますResultReceiver(API 3 以降で使用可能)。

  • アクティビティからサービスを開始するときは、 を作成しResultReceiver、それをサービスを開始するインテントに入れます。
  • サービスでは、 を抽出しResultReceiverて保管します。情報を送信したい場合は、 を使用しますsend()
  • アクティビティでは、たとえばコマンドをトリガーして、が無効であるため削除する必要があることをonDestroy()サービスに通知できます。ResultReceiver

エディド

例えば:

  • あなたの活動で:

    // Global variable.
    private ResultReceiver mResultReceiver = new ResultReceiver() {
    
        @Override
        protected void onReceiveResult(int resultCode, Bundle resultData) {
            // Update the UI here...
        }
    }
    

    サービスを開始すると:

    Intent i = new Intent(this, TheService.class);
    // You can use different action names for different commands.
    i.setAction("REGISTER_RECEIVER");
    i.putExtra("ResultReceiver", mResultReceiver);
    i.putExtra("ResultReceiver_ID", hashCode());
    startService(i);
    

    そしてでonDestroy()

    Intent i = new Intent(this, TheService.class);
    i.setAction("UNREGISTER_RECEIVER");
    i.putExtra("ResultReceiver_ID", hashCode());
    startService(i);
    
  • あなたのサービスで:

    import  android.util.SparseArray;
    
    // ...
    
    private SparseArray<ResultReceiver> mReceiverMap = new SparseArray<ResultReceiver>();
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if ("REGISTER_RECEIVER".equals(intent.getAction())) {
            // Extract the ResultReceiver and store it into the map
            ResultReceiver receiver = intent.getParcelableExtra("ResultReceiver");
            int id = intent.getIntExtra("ResultReceiver_ID", 0);
            mReceiverMap.put(id, receiver);
        } else if ("UNREGISTER_RECEIVER".equals(intent.getAction())) {
            // Extract the ResultReceiver ID and remove it from the map
            int id = intent.getIntExtra("ResultReceiver_ID", 0);
            mReceiverMap.remove(id);
        }
    
        // ...
    }
    
于 2013-03-13T02:59:07.430 に答える