onReceive BroadCast接收器未在服务中被调用

时间:2012-02-03 15:58:11

标签: android service broadcastreceiver alarmmanager

提前感谢您的帮助,对不起我的英语,这是我的情况,我有一个广播接收器,以这种方式完成BOOT:

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>

我认为问题在于未正确调用上次广播接收,因为未创建通知。 有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:0)

您需要在AndroidManifest.xml中将MemoPrenotazione声明为BroadcastReceiver。

检查here以查看您需要添加的内容。

编辑:

在createAlarm中执行此操作:

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

这将明确地将广播定向到您的班级。

这也意味着你可以像这样指定清单:

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

因为您现在不需要过滤器,所以您明确指示广播。