2012-02-03 64 views
0

預先感謝您爲您的幫助和抱歉,我的英語水平,這是我的情況,我有一個廣播接收器是在引導時啓動以這種方式完成:的onReceive在廣播接收器不會被調用的服務

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設置爲特定的時間並推出的PendingIntent,應該是通過創建一個通知其他廣播接收器捕獲,這是代碼:

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> 

我覺得現在的問題是,過去的廣播接收沒有被正確調用,因爲該通知是不創建。 有人可以幫助我嗎?

回答

0

您需要在AndroidManifest.xml中將MemoPrenotazione聲明爲BroadcastReceiver。

檢查here看看你需要添加什麼。

編輯:

在createAlarm做到這一點,而不是:

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

這將明確指示廣播類。

這也意味着你可以指定這樣的清單:

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

因爲你現在不需要過濾你明確指導廣播。

+0

我做這在我的清單: <接收器的android:名稱= 「service.MemoPrenotazione 」> <意圖過濾器> <操作機器人:名字=「 com.mypack.service.MemoPrenotazione」/> 這是不正確的? – user1187793 2012-02-03 16:19:30

+0

我看不到源文件中的包定義,它是什麼?我不認爲你需要名稱中的.service部分。名稱=「。MemoPrenotazione」和名稱=「。BootReceiver」應該工作。 – mcnicholls 2012-02-03 16:22:42

+0

我的軟件包是:package com.mypackage.service;因此,我需要名稱中的.service部分 – user1187793 2012-02-03 16:36:50

相關問題