0

Service指定されたコンポーネントからに明示的なインテントを送信したいActivityBroadcastReceiverで動的に定義しましたMainActivity.java

のコンポーネントを設定しない場合Intentは、アクティビティで受け取ります。ただし、指定されたコンポーネントでは機能しません。それはなぜです?

BroadcastService.java

public class BroadcastService extends IntentService {

    @Override
    public void onCreate() {
        super.onCreate();
        intent = new Intent();
        ComponentName component = new ComponentName(
                MainActivity.class.getPackage().getName(),
                MainActivity.class.getName());
        intent.setComponent(component);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        intent.putExtra("time", new Date().toLocaleString());
        sendBroadcast(intent);
    }
}

MainActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            updateUI(intent);
        }
    };
}
4

2 に答える 2

3

ドキュメントがIntent.setComponent()言うように:

(通常はオプション) インテントを処理するようにコンポーネントを明示的に設定します。デフォルト値の null のままにしておくと、システムはインテントの他のフィールド (アクション、データ、タイプ、カテゴリ) に基づいて、使用する適切なクラスを決定します。このクラスが定義されている場合、他のフィールドに関係なく、指定されたクラスが常に使用されます。特定のクラスを絶対に使用したいことがわかっている場合にのみ、この値を設定してください。それ以外の場合は、システムに適切なクラスを見つけさせて、インストールされているアプリケーションとユーザー設定を尊重することをお勧めします。

しかし、あなたはやっています:

intent = new Intent();
ComponentName component = new ComponentName(
        MainActivity.class.getPackage().getName(),
        MainActivity.class.getName());
intent.setComponent(component);

つまりMainActivity、 内のブロードキャスト レシーバーではなく、を指すコンポーネントを設定するMainActivityため、機能しません。

修正するには、内部ブロードキャスト レシーバーを別のクラスに移動します。しかし、その場合、 のコントロールを操作することはできませんMainActivity。目標をアーカイブする方法は他にもたくさんあります。私はお勧めしResultReceiverます(API 3+で利用可能)。サービスを開始するときResultReceiver、インテントに a を入れます。サービスがアクティビティに情報を送信したい場合は、指定された を介して送信しますResultReceiver

于 2013-03-13T02:45:34.157 に答える