6

アプリケーションで連携するアクティビティとサービスがあります。サービスをリモートサービス(実装されたAIDL)として構成したので、アクティビティが表示されていない場合でも実行を継続します。

このサービスは、サーバーのデータをポーリングし、特定の基準が満たされたときにアラート通知を送信する役割を果たします。アクティビティが表示されているときに、サービスがこれらの通知を送信しないようにします。

サービスが特定のアクティビティのステータスを知る方法はありますか?特にそれに結びついている活動?

権限の問題をトラブルシューティングするためにマニフェストで更新:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.interact.listen.android.voicemail"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".MyAppName"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MyObjectDetails"/>
        <service android:enabled="true" android:name=".MyService" />
        <receiver android:name=".MyReceiver">
            <intent-filter>
                <action android:name="com.foo.bar.EVENT"/>
            </intent-filter>
        </receiver>
    </application>
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>

Logcatで発生するエラー:

09-17 15:33:17.881: WARN/ActivityManager(53): Permission Denial: receiving Intent { act=com.foo.bar.myobject.EVENT (has extras) } to ProcessRecord{43928b40 223:com.foo.bar.myobject/10022} (pid=223, uid=10022) requires com.foo.bar.myobject.EVENT due to sender com.foo.bar.myobject (uid 10022)
09-17 15:33:48.901: WARN/ActivityManager(53): Permission Denial: receiving Intent { act=com.foo.bar.myobject.EVENT (has extras) } to com.foo.bar.myobject requires com.foo.bar.myobject.EVENT due to sender com.foo.bar.myobject (uid 10022)

ブロードキャストを送信するタスク:

@Override
public void onStart(Intent intent, int startId)
{
    super.onStart(intent, startId);
    serviceHandler = new Handler();
    serviceHandler.postDelayed(myTask, 100L);
    Log.d(TAG, "onStart()");
}

class Task implements Runnable
{
    public void run()
    {
        Log.i(TAG, "Getting myObjects...");
        getMyObjects();
        Bundle bundle = new Bundle();
        bundle.putLongArray("ids", getIdsToUpdate());

        Intent i = new Intent();
        i.setAction(UPDATE_ACTION_STRING);
        i.putExtras(bundle);

        sendOrderedBroadcast(i, UPDATE_ACTION_STRING);

        serviceHandler.postDelayed(this, 30000L);
        }
    }
}
4

1 に答える 1

8

サービスが特定のアクティビティのステータスを知る方法はありますか?特にそれに結びついている活動?

ある種のコールバックシステムを実装できます。

しかし、問題を解決するためのよりクリーンな方法があります。順序付けられたブロードキャストを使用します。アクティビティに優先度の高い受信者を配置します。通知の発生ロジックを優先度の低いレシーバーに配置します。abortBroadcast()通知を防ぐために、アクティビティの受信者に電話をかけてもらいます。テクニックについてのブログ投稿があります。イベントバスを使用します:greenrobotのEventBus 、、LocalBroadcastManagerRxベースのイベントバス、またはMutableLiveData。バスにメッセージを投稿してもらいます。UIがフォアグラウンドにあるときに、UIレイヤーにバス上のイベントを登録させます。Notificationバスに乗せられたイベントを誰も受け取らない場合は、サービスにレイズしてもらいます。

于 2010-09-17T00:13:02.477 に答える