为什么LocalBroadCastManager从IntentService发送的意图没有被Activity类中的BroadCastReceiver接收?
ChooseLanguageFragment.java
Intent explicitGetNumberServiceIntentUSA = new Intent(getActivity(), GetNumberService.class); explicitGetNumberServiceIntentUSA.putExtra("country", "USA"); getActivity().startService(explicitGetNumberServiceIntentUSA);
这就是GetNumberService的调用方式。
这是从GetNumberService.java传递arraylist的方式
Intent mobileNumbersIntent = new Intent(); mobileNumbersIntent.putStringArrayListExtra("mobileNumbers", mobileNumberList); mobileNumbersIntent.setAction(ChooseNumber1.MobileNumberBroadcastReceiver.MOBILE_NO_RECEIVER); mobileNumbersIntent.addCategory(Intent.CATEGORY_DEFAULT); mobileNumbersIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //this is needed when callling startActivity() outisde an Activity sendBroadcast(mobileNumbersIntent);
在onHandleIntent()方法中。
GetNumberService完美地完成了它的工作。
ChooseNumber1.java
public class ChooseNumber1 extends AppCompatActivity { private MobileNumberBroadcastReceiver receiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); IntentFilter intentFilter = new IntentFilter(MobileNumberBroadcastReceiver.MOBILE_NO_RECEIVER); intentFilter.addCategory(Intent.CATEGORY_DEFAULT); receiver = new MobileNumberBroadcastReceiver(); registerReceiver(receiver, intentFilter); setContentView(R.layout.activity_choose_number1); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } @Override protected void onDestroy(){ unregisterReceiver(receiver); super.onDestroy(); } public class MobileNumberBroadcastReceiver extends BroadcastReceiver { public static final String MOBILE_NO_RECEIVER = "abcd"; ArrayList mobileNumbersList = new ArrayList(); ListView mobileNumberListView; ArrayAdapter mobileNumberAdapter; @Override public void onReceive(Context context, Intent intent) { // if(intent.getAction().equals(GetNumberService.MOBILE_NUMBER_LIST_PASS_ACTION)){ mobileNumbersList = intent.getStringArrayListExtra("mobileNumberList"); // } mobileNumberAdapter = new ArrayAdapter(new ChooseNumbers(), R.layout.list_item_numbers, R.id.list_item_number_textview, mobileNumbersList); mobileNumberListView = (ListView) findViewById(R.id.listViewNumberList); mobileNumberListView.setAdapter(mobileNumberAdapter); } } }
activity_choose_number1.xml
content_choose_number1.xml
PS 2:
问题是,我无法在ChooseNumber1.java或ChooseNumbersFragment.java中收到mobileNumbersIntent。 我认为问题在于BroadcastManager.java。 如果我调试,它会转到Handler.java和其他几个类,最后mId = -1并且堆栈跟踪没有错误。 我很震惊
PS:AndroidManifest.xml
PS:经过Stackoverflow中的大量示例和答案后,我已经修改了很多代码。 这是我的最新代码。 看起来问题是使用intent-filter和/或使用action获取intent。 请帮帮我。 谢谢。
所需的流程不需要广播和接收器设置。 由于在Service
完成其工作后要启动ChooseNumber1
Activity
,您只需将ArrayList
附加到用于启动ChooseNumber1
的Intent
。 然后可以在onCreate()
检索该列表,并且可以立即初始化ListView
及其Adapter
,而不是尝试等待广播。
例如,在您的Service
,在汇总列表后:
Intent mobileNumbersIntent = new Intent(this, ChooseNumber1.class); mobileNumbersIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mobileNumbersIntent.putStringArrayListExtra("mobileNumbers", mobileNumberList); startActivity(mobileNumbersIntent);
然后,在Activity
:
public class ChooseNumber1 extends AppCompatActivity { private ArrayAdapter mobileNumberAdapter; private ArrayList mobileNumbersList = new ArrayList<>(); private ListView mobileNumberListView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_choose_number1); ... mobileNumberListView = (ListView) findViewById(R.id.listViewNumberList); mobileNumbersList = getIntent().getStringArrayListExtra("mobileNumbers"); if(mobileNumbersList != null) { mobileNumberAdapter = new ArrayAdapter (this, R.layout.list_item_numbers, R.id.list_item_number_textview, mobileNumbersList); mobileNumberListView.setAdapter(mobileNumberAdapter); } } }
你的findViewById()
很好,并返回一个非null。
问题出在mobileNumbersList
中看到的适配器:传递给它的mobileNumbersList
列表在分配适配器时为空。 ArrayAdapter
需要一个非null数组。
(代码还有许多其他问题 – 这只是NPE。)
我建议检查是否可以使用这个简单的代码:
内部活动:
@Override protected void onResume() { super.onResume(); IntentFilter intFilt = new IntentFilter(MYBROADCASTINGSTRING); registerReceiver(updbr,intFilt); } @Override protected void onPause() { super.onPause(); unregisterReceiver(updbr); } private BroadcastReceiver updbr = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent2) { try { Log.d("MYLOG", "gotcha!"); } catch (Exception e) { } } };
在捕获时播放广播:
Intent intentBR = new Intent(MYBROADCASTINGSTRING); intentBR.putExtra(somestring, "teststring"); sendBroadcast(intentBR);
MYBROADCASTINGSTRING
不变的地方。 例如public final static String MYBROADCASTINGSTRING = "MYBROADCASTINGSTRING";
它不需要改进AndroidManifest.xml
。 它有用吗?
当您发送广播时,您正在传递额外的内容
mobileNumbersIntent.putStringArrayListExtra("mobileNumbers", mobileNumberList);
当你在BroadcastReceiver中读取额外内容时,你就是这么做的。
mobileNumbersList = intent.getStringArrayListExtra("mobileNumberList");
你应该使用相同的密钥来额外。 我建议在IntentService
使用常量来实现此目的。
public static final string EXTRA_MOBILE_NUMBERS = "mobile_numbers";
然后你可以做的事情:
mobileNumbersIntent.putStringArrayListExtra(MyIntentService.EXTRA_MOBILE_NUMBERS, mobileNumberList);
和
mobileNumbersList = intent.getStringArrayListExtra(MyIntentService.EXTRA_MOBILE_NUMBERS);
要处理来自IntentService的结果,请使用ResultReciver而不是广播接收器。
喜欢这个,
步骤1: 使用ResultReceiver内部活动创建结果处理程序
public ResultReceiver downloadReceiver = new ResultReceiver(new Handler()) { @Override protected void onReceiveResult(int resultCode, Bundle resultData) { super.onReceiveResult(resultCode, resultData); //Broadcast /send the result code in intent service based on your logic(success/error) handle with switch switch (resultCode) { case 1: { //Get the resultData and do your logic here //Update your list view item here break; } case 2: { //Get the resultData and do your logic here //Update your list view item here break; } } } };
第2步:将结果处理程序放在intent中并启动intent服务
Intent intent = new Intent(getContext(), DownloadService.class); intent.putExtra("receiver",downloadReceiver);
第3步:处理服务类中的intent(获取结果处理程序的值)
final ResultReceiver receiver; @Override protected void onHandleIntent(Intent intent) { receiver = intent.getParcelableExtra("receiver"); }
步骤4:将数据发送/广播到结果处理程序
//based on your logic, change the result code and data //Add your result data (success scenario) Bundle bundle = new Bundle(); bundle.putString("result","Some text"); receiver.send(1,bundle); //Add your result data (failure scenario) receiver.send(0,bundle);
- MediaPlayer.create()始终返回null
- 如何在OpenJDK(Android 7+)中反序列化对象,该对象已在Apache Harmony(Android * -6)中序列化?
- JSON对象无法转换为JSON数组
- 返回上一个Activity,其中有一些`put extra` onClick of recyclerView Item
- 使用带有GridLayoutManager的RecyclerView为手机和平板电脑的不同布局添加动态按钮
- 按钮onClick错误…找不到方法
- Android 4.0 – > 4.3(包含) – Webview页面之间的Web存储丢失
- Android片段无效
- 在ListView中显示Firebase数据