onReceive на BroadCast Receiver не вызывается в службе

Заранее благодарю вас за всю вашу помощь и извините за мой английский, это моя ситуация, у меня есть широковещательный приемник, который запускается при ЗАГРУЗКЕ ЗАВЕРШЕНА следующим образом:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class BootReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {

            Intent serviceIntent = new Intent();
            serviceIntent.setAction("com.mypack.service.RicordaPrenotazione");
            context.startService(serviceIntent);
    }
}

<receiver android:name=".service.BootReceiver">
     <intent-filter>
          <action android:name="android.intent.action.BOOT_COMPLETED" />
          <category android:name="android.intent.category.HOME" />
     </intent-filter>
</receiver>

Этот широковещательный приемник после завершения загрузки запускает эту службу:

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;

import org.json.JSONException;

import android.app.AlarmManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;

import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;


 public class RicordaPrenotazione extends Service {

    public static final String PREFERENCES = "Pref";

    public static final String PREF_CODPAZIENTE = "codice paziente";
    public static final String PREF_NOME = "nome";
    public static final String PREF_COGNOME = "cognome";
    public static final String PREF_CF = "codice fiscale";
    public static final String PREF_TS = "tessera sanitaria";
    public static final String PREF_DATA = "data scadenza";

    private final static String LOG_TAG = "LocalService";

    private static final int NOTIFICATION = 1;

    private NotificationManager notificationManager;
    private Notification notification;
    private PendingIntent pIntent;
    private AlarmManager alarmManager;
    private Calendar calendar;

    private int notificationNumber;

String codPaziente, nome, cognome, codiceFiscale, tesseraSanitaria, dataScadenza,response;
String[] codicePrenotazione,name, surname, descEsame, descSpecialita, descAmbulatorio, descAvvertenza , dataAppuntamento, oraAppuntamento, statoPrenotazione;

ArrayList<HashMap<String, String>>  mylist = new ArrayList<HashMap<String, String>>();
WebService webService = new WebService();

    int numPrenotazioni;
    int count;

@Override  
    public void onCreate() {
            super.onCreate();

            SharedPreferences prefs = getSharedPreferences(PREFERENCES,0);

            codPaziente = prefs.getString(PREF_CODPAZIENTE, "NESSUN CODICE");
            nome = prefs.getString(PREF_NOME, "NESSUN");
            cognome = prefs.getString(PREF_COGNOME, "PROFILO");
            codiceFiscale = prefs.getString(PREF_CF, "XXXXXX00X00X000X");
            tesseraSanitaria = prefs.getString(PREF_TS, "00000000000000000000");
            dataScadenza = prefs.getString(PREF_DATA, "GG-MM-AAAA");

            count = 0;

            try {

                    mylist = webService.recuperaPrenotazioni(codPaziente.trim());

            } catch (JSONException e) {

                    e.printStackTrace();
            }
    }  

    @Override
    public void onDestroy() {

            super.onDestroy();
            Log.i(LOG_TAG, "Service Destroyed");
    }


    @Override
    public IBinder onBind(Intent arg0) {
            // Ritorno null in quanto non si vuole permettere
            // l'accesso al servizio da una applicazione diversa
            return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startid) {  

            if(mylist.isEmpty())
            {
                    Toast.makeText(getApplicationContext(),"Nessuna prenotazione trovata!", Toast.LENGTH_LONG).show();
            }
            else{

                    numPrenotazioni = mylist.size();

                    for(int j=0; j<numPrenotazioni; j++){                            
                             if(mylist.get(j).get("statoPrenotazione").toString().equals("1")){
                                    count++;
                                    createAlarm(mylist.get(j).get("codicePrenotazione").toString(),mylist.get(j).get("descEsame").toString(),mylist.get(j).get("dataAppuntamento").toString(),mylist.get(j).get("oraAppuntamento").toString(),count);

                            }
                    }

            }

            // Solo per debugging
            Log.i(LOG_TAG, "Service Started");

            return super.onStartCommand(intent, flags, startid);
    }

     public void createAlarm (String codicePrenotazioneA, String descEsameA, String dataAppuntamentoA, String oraAppuntamentoA, int count)
    {

            Calendar cal = Calendar.getInstance();

            String[] temp = dataAppuntamentoA.split(" ");
            String[] temp2 = oraAppuntamentoA.split(" ");
            String[] tempData = temp[0].split("-");
            String[] tempOra = temp2[1].split(":");

            cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(tempData[2]));
            cal.set(Calendar.MONTH, Integer.parseInt(tempData[1]));
            cal.set(Calendar.YEAR, Integer.parseInt(tempData[0]));

            cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(tempOra[0])-1);
            cal.set(Calendar.MINUTE, Integer.parseInt(tempOra[1]));

            String ALARM_ACTION = "com.mypack.service.MemoPrenotazione";
            Intent alarmintent = new Intent(ALARM_ACTION);

            alarmintent.putExtra("codPaziente",codPaziente);
            alarmintent.putExtra("nome",nome);
            alarmintent.putExtra("cognome",cognome);

            alarmintent.putExtra("codicePrenotazione", codicePrenotazioneA);
            alarmintent.putExtra("descEsame", descEsameA);
            alarmintent.putExtra("dataAppuntamento", dataAppuntamentoA);
            alarmintent.putExtra("oraAppuntamento", oraAppuntamentoA);
            alarmintent.putExtra("count", count);

            PendingIntent sender = PendingIntent.getBroadcast(getApplicationContext(), NOTIFICATION,
            alarmintent,PendingIntent.FLAG_UPDATE_CURRENT|  Intent.FILL_IN_DATA);

            AlarmManager am = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
            am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);

    }

 }

<service android:name=".service.RicordaPrenotazione">
        <intent-filter>
            <action android:name="com.mypack.service.RicordaPrenotazione" />
        </intent-filter>
 </service>

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

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

import android.os.Bundle;
import android.util.Log;

public class MemoPrenotazione extends BroadcastReceiver {

    public static int NOTIFICATION_ID = 1;

    String title, note, codPaziente, nome, cognome;
    String codicePrenotazione, descEsame, dataAppuntamento, oraAppuntamento;
    int count;

    private NotificationManager manger;
    private Notification notification;
    private PendingIntent contentIntent;


    @Override
    public void onReceive(Context context, Intent intent) {

            Bundle extras = intent.getExtras();

            codPaziente = extras.getString("codPaziente");
            nome = extras.getString("nome");
            cognome = extras.getString("cognome");

            codicePrenotazione = extras.getString("codicePrenotazione");
            descEsame = extras.getString("descEsame");
            dataAppuntamento = extras.getString("dataAppuntamento");
            oraAppuntamento = extras.getString("oraAppuntamento");
            count = extras.getInt("count");

            title = "Memo Prenotazione";
            note = descEsame + " il " + dataAppuntamento + " alle "
                            + oraAppuntamento;

            manger = (NotificationManager) context
                            .getSystemService(Context.NOTIFICATION_SERVICE);

            int icon = R.drawable.icon;
            CharSequence tickerText = "Memo prenotazione";
            long when = System.currentTimeMillis();

            notification = new Notification(icon, tickerText, when);

            Intent i = new Intent(context, HttpGetTaskActivity.class);
            Bundle b = new Bundle();

            b.putString("codPaziente", codPaziente);
            b.putString("nome", nome);
            b.putString("cognome", cognome);

            i.putExtras(b);

            contentIntent = PendingIntent.getActivity(context, NOTIFICATION_ID, i,
                            PendingIntent.FLAG_UPDATE_CURRENT);

            notification.setLatestEventInfo(context, title, note, contentIntent);

            notification.flags |= Notification.FLAG_AUTO_CANCEL;

            notification.defaults |= Notification.DEFAULT_SOUND; // Suona
            notification.defaults |= Notification.DEFAULT_LIGHTS; // LED
            notification.defaults |= Notification.DEFAULT_VIBRATE; // Vibra

            manger.notify(NOTIFICATION_ID, notification);

    }
 }

<receiver android:name=".service.MemoPrenotazione">
   <intent-filter>
       <action android:name="com.mypack.service.MemoPrenotazione" />
   </intent-filter>
</receiver>

Я думаю, что проблема в том, что последний широковещательный прием вызывается неправильно, потому что уведомление не создается. Кто-нибудь может мне помочь?


person user1187793    schedule 03.02.2012    source источник


Ответы (1)


Вам нужно объявить MemoPrenotazione как BroadcastReceiver в вашем AndroidManifest.xml.

Проверьте здесь, чтобы узнать, что вам нужно добавить.

РЕДАКТИРОВАТЬ:

В createAlarm сделайте это вместо этого:

Intent alarmIntent = new Intent(context, MemoPrenotazione.class);

Это явно направит трансляцию в ваш класс.

Это также означает, что вы можете указать манифест следующим образом:

<receiver android:name=".service.MemoPrenotazione" />

поскольку вам не нужен фильтр, теперь вы явно управляете трансляцией.

person mcnicholls    schedule 03.02.2012
comment
Я делаю это в своем манифесте: ‹приемник android:name=.service.MemoPrenotazione› ‹intent-filter› ‹action android:name=com.mypack.service.MemoPrenotazione /› ‹/intent-filter› ‹/receiver› Это не правильный? - person user1187793; 03.02.2012
comment
Я не вижу определения пакета в ваших исходных файлах, что это? Я не думаю, что вам нужна часть .service в именах. name=.MemoPrenotazione и name=.BootReceiver должны работать. - person mcnicholls; 03.02.2012
comment
Мой пакет: пакет com.mypackage.service; по этой причине мне нужна часть .service в именах - person user1187793; 03.02.2012
comment
Если у вас есть один и тот же пакет во всех ваших исходных файлах, вам не нужна часть .service. Я думаю, что в настоящее время он будет разрешать имена как com.mypackage.service.service.MemoPrenotazione, что неверно. - person mcnicholls; 03.02.2012
comment
моя ситуация такова: com.mypackage. и у меня есть 3 удаленных папки, утилита, служба и некоторая активность в корневой папке .... внутри папки службы есть BootReceiver.java, MemoPrenotazione.java и RicordaPrenotazione.java ... только MemoPrenotazione не работает - person user1187793; 03.02.2012
comment
Проверьте мое редактирование. Явное управление вашей трансляцией должно сделать эту работу намного проще, чем попытки управлять ею неявно, основываясь на действии. - person mcnicholls; 03.02.2012
comment
Я сделал это: Intent alarmintent = new Intent(getApplicationContext(), MemoPrenotazione.class); Но не работает, я не понимаю... есть ли другой способ сделать то, что мне нужно? - person user1187793; 03.02.2012
comment
Мое приложение показывает бронирование клиента, когда клиент подтверждает бронирование, я создаю уведомление, чтобы клиент запомнил дату и время бронирования. Моя идея заключалась в том, чтобы запустить службу, когда загрузка завершила этот разговор с веб-службой, чтобы принять все бронирования клиента и выбрать, какие из них были подтверждены. После этого возьмите дату и время этого бронирования и создайте уведомление, например, за час до этого. - person user1187793; 03.02.2012
comment
Вы также удалили фильтр намерений в определении получателя в манифесте? - person mcnicholls; 06.02.2012