2012-02-03 2 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

Вам необходимо объявить MemoPrenotazione как BroadcastReceiver в вашем AndroidManifest.xml.

Проверьте, пожалуйста, here, чтобы увидеть, что вам нужно добавить.

EDIT:

В createAlarm сделать это вместо:

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

Это явно прямой трансляции в вашем классе.

Это также означает, что вы можете указать манифест, как это:

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

как вам не нужен фильтр теперь вы явно направления вещания.

+0

Я делаю это в моем манифесте: <приемник андроид: имя = "service.MemoPrenotazione "> <намеренного фильтр> <действие андроид: имя =" com.mypack.service.MemoPrenotazione" /> Неверное? – user1187793

+0

Я не вижу определения пакета в ваших исходных файлах, что это такое? Я не думаю, что вам нужна часть .service в именах. name = ". MemoPrenotazione" и name = ". BootReceiver" должен работать. – mcnicholls

+0

Моя упаковка: package com.mypackage.service; по этой причине мне нужна .service часть в именах – user1187793

Смежные вопросы