片段中的广播接收器
Broadcast receiver in a Fragment
我的 Fragment 中有一个广播接收器,用于跟踪任何新收到的短信。
private BroadcastReceiver smsBroadcastReceiver;
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
smsBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("smsBroadcastReceiver", "onReceive");
}
};
}
@Override
public void onStart() {
super.onStart();
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(smsBroadcastReceiver, filter);
}
@Override
public void onStop() {
super.onStop();
LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(smsBroadcastReceiver);
}
以及清单中的权限:
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
问题是我从来没有得到日志Log.e("smsBroadcastReceiver", "onReceive");
我肯定在收件人还在注册的时候收到了短信。
但是,如果我将接收器写成一个单独的 class 并将其放入清单中,则会调用它的 onReceive()。
我是不是漏掉了什么?
我是不是漏掉了什么?
是的..你错过了反对寿命的一点。当您在片段中注册广播接收器时,接收器对象将一直存在,直到片段存在。当片段被销毁时,接收者也被取消注册。因此,只要片段处于活动状态,那么只有您会收到广播,否则它将无法工作。要在应用程序不在前台时接收广播,您必须在清单文件中注册广播。
更新
这样试试
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
private BroadcastReceiver smsBroadcastReceiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("smsBroadcastReceiver", "onReceive");
}
};
然后像
一样注册你的接收器
getActivity().registerReceiver(smsBroadcastReceiver, filter);
并像
一样注销
getActivity().unregisterReceiver(smsBroadcastReceiver);
我的 Fragment 中有一个广播接收器,用于跟踪任何新收到的短信。
private BroadcastReceiver smsBroadcastReceiver;
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
smsBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("smsBroadcastReceiver", "onReceive");
}
};
}
@Override
public void onStart() {
super.onStart();
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(smsBroadcastReceiver, filter);
}
@Override
public void onStop() {
super.onStop();
LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(smsBroadcastReceiver);
}
以及清单中的权限:
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
问题是我从来没有得到日志Log.e("smsBroadcastReceiver", "onReceive");
我肯定在收件人还在注册的时候收到了短信。
但是,如果我将接收器写成一个单独的 class 并将其放入清单中,则会调用它的 onReceive()。
我是不是漏掉了什么?
我是不是漏掉了什么?
是的..你错过了反对寿命的一点。当您在片段中注册广播接收器时,接收器对象将一直存在,直到片段存在。当片段被销毁时,接收者也被取消注册。因此,只要片段处于活动状态,那么只有您会收到广播,否则它将无法工作。要在应用程序不在前台时接收广播,您必须在清单文件中注册广播。
更新
这样试试
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
private BroadcastReceiver smsBroadcastReceiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("smsBroadcastReceiver", "onReceive");
}
};
然后像
一样注册你的接收器getActivity().registerReceiver(smsBroadcastReceiver, filter);
并像
一样注销getActivity().unregisterReceiver(smsBroadcastReceiver);