1

私の要件は、あるAPPから別のAPPにブロードキャストでいくつかのイベントを通知したいのですが、他のAPPにもブロードキャストを受信させたくないということです。したがって、許可を得た sendOrderedBroadcast は良い解決策だと思います。

次に、私のテストは次のようになります。

BCSender APP:
カスタム権限を定義し、この権限でブロードキャストを送信します:

<permission 
    android:protectionLevel="normal"
    android:name="com.czou.permission.BC" />

BCSender での唯一のアクティビティ:

package com.example.bcsender;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;

public class MainActivity extends Activity {

    private static String BC_PERMISSION = "com.czou.permission.BC";

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

        sendBroadcast();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    private void sendBroadcast()
    {
        Intent intent = new Intent("android.intent.action.czou_broadcast");
        intent.putExtra("msg", "hello from czou");
        sendOrderedBroadcast(intent, BC_PERMISSION);
        //sendBroadcast(intent, BC_PERMISSION);
    }    
}


BCReceiverA APP: BCSender
APP で定義されたアクセス許可を宣言し、ブロードキャスト レシーバーを登録します。

<user-permission android:name="com.czou.permission.BC" />

BCReceiverA の唯一のアクティビティ:

package com.example.bcreceivera;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.Menu;

public class MainActivity extends Activity {        
    private static String TAG = "BCReceiverA";

    private BroadcastReceiver mReceiver = null;

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

        registerReceiver();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    @Override
    public void onDestroy()
    {
        super.onDestroy();

        unregisterReceiver();
    }

    private void registerReceiver()
    {
        android.util.Log.d(TAG, "register receiver.");
        mReceiver = new BroadcastReceiver() 
        {
            @Override
            public void onReceive(Context context, Intent intent)
            {
                String msg = intent.getStringExtra("msg");
                android.util.Log.d(TAG, "Receive broadcast. " + msg);

                Bundle bundle = new Bundle();
                bundle.putString("msg", msg + "pass through ReceverA");
                setResultExtras(bundle);
                abortBroadcast();
            }
        };

        IntentFilter intentFilter = new IntentFilter("android.intent.action.czou_broadcast");
        intentFilter.setPriority(1000);
        this.registerReceiver(mReceiver, intentFilter);


    }

    private void unregisterReceiver()
    {
        android.util.Log.d(TAG, "unregister receiver.");
        this.unregisterReceiver(mReceiver);     
    }    
}


BCSender では、私が使用していることがわかりますsendOrderedBroadcast(intent, BC_PERMISSION)。その結果、BCReceiverA はブロードキャストを受信できず、どちらも受信できませんsendBroadcast(intent, BC_PERMISSION)。でも を使えばsendBroadcast(intent)、受信機はそれを得ることができます。

それで、sendBroadcast()/sendOrderedBroadcast()ここで何が問題なのですか?

4

1 に答える 1

4

あなたが持ってい<user-permission>ます。要素名は であるはず<uses-permission>です。

また、両方のアプリで要素を宣言したい場合が<permission>あるため、インストールの順序は重要ではありません。それ以外の場合は、<permission>アプリのにアプリインストールする必要があります。<uses-permission>

于 2013-03-29T11:30:01.447 に答える