[英]onReceive on BroadCast Receiver not being called in a service
預先感謝您的所有幫助,對於我的英語,我們深感抱歉,這是我的情況,我有一個廣播接收器,它以這種方式從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>
我認為問題在於,由於未創建通知,因此上次廣播接收未正確調用。 有人可以幫我嗎?
您需要在AndroidManifest.xml中將MemoPrenotazione聲明為BroadcastReceiver。
在此處查看您需要添加的內容。
編輯:
在createAlarm中執行以下操作:
Intent alarmIntent = new Intent(context, MemoPrenotazione.class);
這將明確地將廣播定向到您的班級。
這也意味着您可以這樣指定清單:
<receiver android:name=".service.MemoPrenotazione" />
由於您現在不需要過濾器,因此可以明確地定向廣播。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.