2016-11-08 4 views
4

Я пытаюсь отправить сериализуемый объект в ожидающее намерение. Проблема заключается в том, что принимаемый сигнал тревоги возвращается как null. Несмотря на то, что Alarm реализует сериализуемый интерфейс.Пропустить Serializable Object to Pending Intent

//AlarmService.java 

Intent myIntent = new Intent(getApplicationContext(), AlarmAlertBroadcastReciever.class); 
Bundle bundle = new Bundle(); 
bundle.putSerializable("alarm", alarm); 
myIntent.putExtras(bundle); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, myIntent, PendingIntent.FLAG_CANCEL_CURRENT); 

AlarmManager alarmManager = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE); 

alarmManager.set(AlarmManager.RTC_WAKEUP, alarm.getAlarmTime().getTimeInMillis(), pendingIntent); 

Принятая тревога является нулевой.

//AlarmAlertBroadcastReceiver.java 

public class AlarmAlertBroadcastReciever extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Alarm alarm = (Alarm)intent.getExtras().getSerializable("alarm"); 
    } 
} 

Edit: еще несколько вещей, которые я пробовал следующим образом, но это не похоже на работу:

//AlarmService.java 

Intent myIntent = new Intent(getApplicationContext(), AlarmAlertBroadcastReciever.class); 
myIntent.putExtra("alarm", alarm); 
myIntent.setAction("abc.xyz"); 

PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

AlarmManager alarmManager = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE); 

alarmManager.set(AlarmManager.RTC_WAKEUP, alarm.getAlarmTime().getTimeInMillis(), pendingIntent); 

Сигнал принимается равна нулю.

//AlarmAlertBroadcastReceiver.java 

public class AlarmAlertBroadcastReciever extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Alarm alarm = (Alarm)intent.getExtras().getSerializable("alarm"); 
     //Alarm alarm = (Alarm)intent.getSerializableExtra("alarm"); 
    } 
} 
+0

Возможный дубликат [Как передать пользовательские Serializable объект BroadcastReceiver через PendingIntent] (http://stackoverflow.com/questions/39209579/how- to-pass-custom-serializable-object-to-broadcastreceiver-through-pendingintent) – 0X0nosugar

ответ

1

Я использую android Nougat, поэтому ни один из этих ответов не сработал. Я закончил передачу объектов в массив байтов.

//AlarmService.java 

Intent myIntent = new Intent(getApplicationContext(), AlarmAlertBroadcastReciever.class); 
ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
ObjectOutputStream out = null; 
try { 
    out = new ObjectOutputStream(bos); 
    out.writeObject(alarm); 
    out.flush(); 
    byte[] data = bos.toByteArray(); 
    myIntent.putExtra("alarm", data); 
} catch (IOException e) { 
    e.printStackTrace(); 
} finally { 
    try { 
     bos.close(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, myIntent, PendingIntent.FLAG_CANCEL_CURRENT); 

AlarmManager alarmManager = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); 
alarmManager.set(AlarmManager.RTC_WAKEUP, alarm.getAlarmTime().getTimeInMillis(), pendingIntent); 

Тогда я получил Byte []

//AlarmAlertBroadcastReceiver.java 

@Override 
public void onReceive(Context context, Intent intent) { 
    ByteArrayInputStream bis = new ByteArrayInputStream(intent.getByteArrayExtra("alarm")); 
    ObjectInput in = null; 
    Alarm alarm = null; 
    try { 
     in = new ObjectInputStream(bis); 
     alarm = (Alarm)in.readObject(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (in != null) { 
       in.close(); 
      } 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 
+0

Почему бы не разобрать объект jsonString и перейти к намерению? –

0

У вас есть putSerializable в Bundle. И вы пытаетесь сделать getSerializable от намерения.

For set : `myIntent.putExtra("alarm", alarm);` 
For get : `(Alarm)intent.getExtras().getSerializableExtra("alarm");` 
Also make sure your `Alarm` calss have `implements` with `Serializable`. 

попробуйте это.

+0

Это хорошая мысль. Я просто попробовал, и он все равно возвращает null. –

+0

Я просто обновляю свои ан. можете ли вы это посмотреть. –

+0

Я пробовал '(Тревога) intent.getSerializableExtra (« alarm »)' и '(Alarm) intent.getExtras(). GetSerializable (« alarm »)' для приема и 'myIntent.putExtra (« alarm », alarm) ; 'для отправки. Это все null ... –

0

Намерение putExtra (имя String, Parcelable значения)

Добавить расширенные данные намерения. Имя должно содержать префикс пакета, например, приложение com.android.contacts будет использовать имена типа «com.android.contacts.ShowAll».

Reference

+0

К сожалению, это не помогло. –

+0

Попытайтесь использовать 'FLAG_UPDATE_CURRENT' – IMXQD

+0

Спасибо, но FLAG_UPDATE_CURRENT, похоже, не захотел работать либо –

0

Это предложение, вы можете попробовать parcelabler, который является более эффективным и специально для андроида конкретных потребностей. поэтому получить ваш класс модели поделен here. после этого вставьте в ваш проект, а затем передать его на другой вид деятельности, используя либо расслоение

bundle.putParcelable(KEY_PARCEL, detailModelsList.get(position)); 

или

intent.putParcelableArrayListExtra("Parcelaber",myList); 
+0

Я мог бы попробовать, если я не могу получить эту сериализуемую вещь для работы –

0

Есть 2 вещи, которые я хочу предложить:

  1. Вы должны установить Action в ваши намерения, такие как: yourIntent.setAction("abc.xyz")
  2. Вы должны использовать FLAG_UPDATE_CURRENT вместо FLAG_CANCEL_CURRENT

Надеется, что это помогает.

+0

Это были хорошие мысли. По какой-то причине они, похоже, не хотят работать :( –

0

Вы пробовали с каким-либо другим идентификатором запроса, кроме 0

для например

int requestID = (int) System.currentTimeMillis(); 

PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), requestID , myIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

public void onReceive(Context context, Intent intent) { 

     if(intent!=null && intent.hasExtra("alarm")){ 
     Alarm alarm = (Alarm)intent.getExtras().getSerializable("alarm"); 
     } 

    } 
+0

Это хорошая мысль. По какой-то причине она по-прежнему возвращает нуль. –

6

Там известны проблемы, с проставлением пользовательских объектов в Intent, который затем передается AlarmManager или NotificationManager или другими внешним Приложения. Вы можете попытаться обернуть свой пользовательский объект в Bundle, так как это иногда срабатывает.Например, измените код на:

Intent myIntent = new Intent(getApplicationContext(), 
          AlarmAlertBroadcastReciever.class); 
Bundle bundle = new Bundle(); 
bundle.putSerializable("alarm", alarm); 
myIntent.putExtra("bundle", bundle); 

и AlarmAlertBroadcastReciever.onReceive():

Bundle bundle = intent.getBundleExtra("bundle"); 
if (bundle != null) { 
    Alarm alarm = (Alarm)bundle.getSerializable("alarm"); 
} 

Если это не работает (и это должно работать на большинстве Android версии/устройств, но не все, особенно очень новый), вам нужно будет преобразовать ваш объект Serializeable в byte[] и поместить byte[] в дополнительные услуги.

Есть десятки примеров того, как это сделать на Stackoverflow.

+1

Спасибо, это помогло. В итоге я передал свой объект байтом [], потому что я Я работаю с Nougat на своем телефоне, который сработал. –

+0

Прохождение пакета с сериализуемым отработанным штрафом! – Petrus

Смежные вопросы