似乎无法动态注册Broadcastreceiver

时间:2016-04-29 22:26:03

标签: android broadcastreceiver sms intentfilter

我对Android很新,我一直在尝试动态注册我的Broadcastreceiver,所以我可以接收smss,但我似乎无法让它工作,这是我的代码:

public class MainActivity extends AppCompatActivity {

BroadcastReceiver receiver;

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

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

        }
    });

    receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(getApplicationContext(), "Hellllo", Toast.LENGTH_SHORT).show();
        }
    };
    IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
    registerReceiver(receiver,filter);
}

“hello”Toast不会弹出,所以我假设接收器没有注册

我把这个权限放在我的清单中:

<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS"></uses-permission>

我缺少什么?

1 个答案:

答案 0 :(得分:0)

我们在评论中确定SMS_RECEIVED广播正被其他应用拦截和中止。这在KitKat(API 19)之前的Android中是可能的,但从那以后版本就不存在。

解决方案是使用IntentFilter方法将999实例的优先级设置为IntentFilter#setPriority()

但请注意,在您收到广播之前,其他应用仍然可以中止广播。虽然文档说具有相同优先级IntentFilter的接收者将以任意顺序传送广播,但通常会按照安装应用的顺序传送它们。此外,某些应用程序(例如系统应用程序,预安装的应用程序等)的优先级可能高于999,这是您应用的最大实用价值。