Заранее благодарю за всю вашу помощь и извините за мой английский, это мое положение, у меня есть Broadcast Receiver, который начинается с BOOT COMPLETED таким образом:
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>
Я думаю, что проблема в том, что последний широковещательный прием вызывается неправильнопотому что уведомление не создано.Кто-нибудь может мне помочь?