2015-11-05 7 views
2

Я использую IntentService (в первый раз), и я намерен вернуть результат этой услуги с помощью Bundle. Однако, когда я это делаю, основная деятельность не найдена Bundle, возвращая null. Что может быть причиной этого? Строковые ключи соответствуют!Деятельность не может найти Bundle in Intent

В коде гофрированных выходов:

I/System.out: It's null 

Основная деятельность:

public class MainMenu extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     //Some stuff here... 

     IntentFilter intentFilter = new IntentFilter(); 
     intentFilter.addAction(StorageHandler.TRANSACTION_DONE); 
     registerReceiver(broadcastReceiver, intentFilter); 
     Intent i = new Intent(this, StorageHandler.class); 
     startService(i); 
    } 



    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      Bundle extra = getIntent().getBundleExtra("bundle"); 

      if(extra == null){ 
       System.out.println("It's null"); 
      } 
      else { 
       ArrayList<String> objects = (ArrayList<String>) extra.getSerializable("objects"); 
       System.out.println(objects.get(0)); 
      } 
     } 
    }; 

} 

IntentService:

public class StorageHandler extends IntentService{ 

    public static final String TRANSACTION_DONE = "xx.xxxxx.xxxxxx.TRANSACTION_DONE"; 

    public StorageHandler() { 
     super("StorageHandler"); 
    } 

    public void onCreate(){ 
     super.onCreate(); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     notifyFinished(); 
    } 

    private void notifyFinished(){ 
     ArrayList<String> objects = new ArrayList<String>(); 
     objects.add("Resulting Array here"); 

     Bundle extra = new Bundle(); 
     extra.putSerializable("objects", objects); 

     Intent i = new Intent(); 
     i.setAction(xx.xxxxx.xxxxxx.StorageHandler.TRANSACTION_DONE); 
     i.putExtra("bundle", extra); 

     StorageHandler.this.sendBroadcast(i); 
    } 

ответ

1

Вы пытаетесь извлечь данные из неправильного Intent.

Изменение:

Bundle extra = getIntent().getBundleExtra("bundle"); 

To:

Bundle extra = intent.getBundleExtra("bundle"); 

Intent, который содержит ваши данные поставляются в качестве одного из параметров onReceive() метода BroadcastReceiver «s.

1

вы используете getIntent(), чтобы получить вещания намерения. Это не верно. Цель, которую вы должны использовать, - это прежний параметр onReceive. Изменение

Bundle extra = getIntent().getBundleExtra("bundle"); 

с

Bundle extra = intent.getBundleExtra("bundle"); 
0

Просто используйте это в вашей деятельности:

onResume В обратном вызове Вы должны зарегистрироваться registerReceiver(broadcastReceiver, intentFilter);

И в обратного вызова следует отменить этот приемник. В ресивере используйте:

Bundle extra = intent.getBundleExtra("bundle");

В вашем использовании услуг этот код:

Intent i = new Intent(TRANSACTION_DONE).putExtra("bundle", extra); 
      this.sendBroadcast(i); 

Больше информации см This Answer

0

Не забудьте это в OnCreate MainActivity:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    //All your code here 
} 

Я говорю это, потому что я ont видеть, что строка кода в вашем методе!

+0

Это включено в область «Некоторые вещи здесь ...». Но спасибо за головы. – AmiguelS