在片段中注册和取消注册BroadcastReceiver
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在片段中注册和取消注册BroadcastReceiver相关的知识,希望对你有一定的参考价值。
我的应用有一个带有3个片段标签的操作栏。在第二个片段中,我注册并取消注册BroadcastReceiver。我在onPause
取消注册接收器,并在onCreateView
和onResume
中注册。
getActivity().registerReceiver(this.batteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
和
getActivity().unregisterReceiver(batteryInfoReceiver);
1)两次注册相同的接收器是否可以(在onCreateView和onResume上)?(它是无害的吗?)
2)仅在onResume中注册接收器是否足够?
答案
看看life-cycle的Fragments
:
onCreateView():当片段第一次绘制其用户界面时,系统会调用它。要为片段绘制UI,必须从此方法返回视图,该视图是片段布局的根。如果片段不提供UI,则可以返回null。
onResume():片段在正在运行的活动中可见
onPause():这通常是您应该提交应该在当前用户会话之外保留的任何更改的地方(因为用户可能不会回来)。
结论:
所以最好只在onResume()
中注册接收器并在onPause()
中取消注册,因为onCreateView()
只处理视图层次结构。它与接收器无关。所以它没有害处,但肯定没用。
我希望它会有所帮助!!
另一答案
这是适用于我的代码:
内部布局:
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="sendInternalBroadcast"
android:text="Broadcast"/>
片段布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:gravity="center">
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="Fragment One"
android:id="@+id/fragmentoneTextView1"/>
</LinearLayout>
在主要活动内:
public void sendInternalBroadcast(View view)
{
Intent intent = new Intent();
intent.setAction("com.codingbadly.stefanronnkvist.simplebroadcastreceiver.setup");
intent.putExtra("From", "sendInternalBroadcast");
sendBroadcast(intent);
}
分段:
import android.app.*;
import android.content.*;
import android.os.*;
import android.view.*;
import android.widget.*;
public class FragmentOne extends Fragment
{
View view;
Context _context;
PendingIntent pi;
BroadcastReceiver br;
AlarmManager am;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
view = inflater.inflate(R.layout.fragmentone, container, false);
setup();
return view;
}
@Override
public void onAttach(Context context)
{
super.onAttach(context);
_context = context;
}
@Override
public void onDestroyView()
{
super.onDestroyView();
_context.unregisterReceiver(br);
}
private void setup()
{
br = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent i)
{
TextView tv = (TextView)view.findViewById(R.id.fragmentoneTextView1);
tv.setText("onReceive");
}
};
_context.registerReceiver(br, new IntentFilter("com.codingbadly.stefanronnkvist.simplebroadcastreceiver.setup"));
pi = PendingIntent.getBroadcast(_context, 0, new Intent("com.codingbadly.stefanronnkvist.simplebroadcastreceiver.setup"), 0);
am = (AlarmManager)(_context.getSystemService(Context.ALARM_SERVICE));
}
}
祝你好运.. Stefan Ronnkvist
另一答案
OnResume注册:
context.registerReceiver(receiver,IntentFilter(BroadCastAction.action_success))
onPause unRegister:
context.unregisterReceiver(mContactBroadCastReceiver);
以上是关于在片段中注册和取消注册BroadcastReceiver的主要内容,如果未能解决你的问题,请参考以下文章