Android 在服务中未调用广播接收器上的onReceive

Android 在服务中未调用广播接收器上的onReceive,android,service,broadcastreceiver,alarmmanager,Android,Service,Broadcastreceiver,Alarmmanager,提前感谢您的帮助,并为我的英语感到抱歉,这是我的情况,我有一个从开机时启动的广播接收器,以这种方式完成: import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class BootReceiver extends BroadcastReceiver{ @Override public void onReceiv

提前感谢您的帮助,并为我的英语感到抱歉,这是我的情况,我有一个从开机时启动的广播接收器,以这种方式完成:

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设置为特定时间并启动PendingEvent,该PendingEvent应由创建通知的其他广播接收器捕获,代码如下:

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>
我认为问题在于没有正确调用最后一次广播接收,因为没有创建通知。
有人可以帮我吗?

您需要在AndroidManifest.xml中声明MemoPrenotazione作为广播接收器

查看需要添加的内容

编辑:

在createAlarm中,改为执行以下操作:

Intent alarmIntent = new Intent(context, MemoPrenotazione.class);
这将显式地将广播定向到您的类

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

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

因为您现在不需要过滤器,所以显式地引导广播。

我在清单中这样做:不正确?我在源文件中看不到包定义,它是什么?我认为你不需要名字里的服务部分。name=.MemoPrenotazione和name=.BootReceiver应该可以工作。我的包是:package com.mypackage.service;因此,我需要名称中的.service部分。如果所有源文件中都有相同的包,则不需要.service部分。我认为目前它将解析名称为com.mypackage.service.service.MemoPrenotazione,这是错误的。我的情况是:com.mypackage。我在根文件夹中有3个文件夹remote、util、service和一些活动…在服务文件夹中有bootceiver.java、MemoPrenotazione.java和RicordaPrenotazione.java…只有MemoPrenotazione不能工作