为什么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附加到用于启动ChooseNumber1Intent 。 然后可以在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);