我的要求是,我想从一个应用程序通过广播通知另一个应用程序一些事件,但我不希望其他应用程序也收到广播。所以我认为 sendOrderedBroadcast with permission 是一个很好的解决方案。
然后我的测试看起来像这样:
BCSender APP:
定义自定义权限,并使用该权限发送广播:
<permission
android:protectionLevel="normal"
android:name="com.czou.permission.BC" />
BCSender 中唯一的 Activity :
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 中唯一的 Activity :
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()
有什么问题?
最佳答案
你有 <user-permission>
.元素名称应该是 <uses-permission>
.
此外,您可能希望声明 <permission>
两个应用程序中的元素,因此它们的安装顺序无关紧要。否则,<permission>
必须在<uses-permission>
之前安装应用程序应用程序。
关于android - 如何使用自定义权限向其他APP发送OrderedBroadcast?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15699039/