BroadcastReceiver.Что не так в моем коде? - PullRequest
0 голосов
/ 29 апреля 2011

код получателя:

public class OnBootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

          try {
                BufferedReader in=new BufferedReader(
                        new FileReader(MainNote.log));


                String AlarmString;
                int i = 0;


                while ((AlarmString = in.readLine())!=null)
                {
                    Long AlarmTime = Long.parseLong(AlarmString.substring(0, AlarmString.indexOf(" ")));
                    if (AlarmTime < System.currentTimeMillis()) i++;
                    else {
                        String AlarmArray[] = AlarmString.split("\\s");
                        Intent AlarmIntent = new Intent(context, AlarmReceiver.class);
                        if (AlarmArray[1].equals("null")) AlarmIntent.putExtra("alarm_message", "");
                        else AlarmIntent.putExtra("alarm_message", AlarmArray[1]);
                        if (AlarmArray[2].equals("true"))
                        AlarmIntent.putExtra("Vibration", true);
                        else AlarmIntent.putExtra("Vibration", false);
                        if (AlarmArray[3].equals("true"))
                        AlarmIntent.putExtra("Sound", true);
                        else AlarmIntent.putExtra("Sound", false);

                         final int _ID = (int) System.currentTimeMillis(); 
                         PendingIntent sender = PendingIntent.getBroadcast(context , _ID, AlarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
                         AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
                         am.set(AlarmManager.RTC_WAKEUP, AlarmTime, sender);
                    }
                }

Код AlarmReceiver.class

public class AlarmReceiver extends BroadcastReceiver {

 @Override
 public void onReceive(Context context, Intent intent) {
     Bundle bundle = intent.getExtras();
     String message = bundle.getString("alarm_message");
     boolean Vibration = bundle.getBoolean("Vibration");
     boolean Sound = bundle.getBoolean("Sound");
     if (message.equals(null))
     NotifierHelper.sendNotification(context, MainNote.class, context.getResources().getString(R.string.NotTitle), context.getResources().getString(R.string.Nodiscr), 1, Sound, true, Vibration);
     else 
     NotifierHelper.sendNotification(context, MainNote.class, context.getResources().getString(R.string.NotTitle), message, 1, Sound, true, Vibration);
 }
}

Manifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="4" />
    <uses-permission android:name="android.permission.VIBRATE" />   
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />   
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />   
    <uses-permission android:name="android.permission.WAKE_LOCK" />    

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:label="@string/app_name" android:name=".MainNote">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".FingerPaint"></activity>
    <receiver  android:process=":remote" android:name=".AlarmReceiver"></receiver>

        <receiver android:name=".OnBootReceiver">
            <intent-filter>
                <action                      
android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>     
    </application>
</manifest>

MainNote.log может стоить, например,

1304094118826 text true true

После перезагрузки я вижу, что мой процесс запущен, но у меня нет уведомлений. Что здесь не так? А как отлаживать код в OnBootReciever?

Я заменяю свой код в OnBootReciever на

Intent AlarmIntent = new Intent(context, AlarmReceiver.class);
        AlarmIntent.putExtra("alarm_message", "blabla");
        AlarmIntent.putExtra("Vibration", true);
        AlarmIntent.putExtra("Sound", true);

         final int _ID = (int) System.currentTimeMillis(); 
         PendingIntent sender = PendingIntent.getBroadcast(context , _ID, AlarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
         AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
         am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+6000, sender); 

И его работа. Так что проблема в части, где я читаю информацию из файла.

Одна проблема была в MainNote.log. Зарегистрируйте его статическую переменную, поэтому я не могу связаться с этим здесь. Но сейчас у меня очень странная проблема -

java.io.FileNotFoundException: /mnt/sdcard/AlarmsFromDrawNote.alm (Permission denied)
com.notedraw.bos.app.OnBootReceiver1.onReceive(OnBootReceiver1.java:30) 

30-я строка -

BufferedReader in=new BufferedReader(new FileReader(log)); 

WTF? (см. манифест)

Ответы [ 2 ]

1 голос
/ 29 апреля 2011

Ваш AlarmReceiver должен быть статическим BroadcastReceiver, как и ваш OnBootReceiver, чтобы он воздействовал на установленный вами сигнал тревоги.К сожалению, я не думаю, что у вас может быть более одного статического приемника на приложение (я пробовал раньше, и у меня это не сработало).Вы можете попробовать установить два фильтра намерений на свой OnBootReceiver и заставить его работать с обеими трансляциями.

В вашем onRecieve просто проверьте intent.getAction(), чтобы увидеть, какую трансляцию он получает (загрузочная или аварийная сигнализация)и действуй соответствующим образом.

0 голосов
/ 29 апреля 2011

Вам необходимо создать новый приемник вещания внутри класса, в который будет приниматься вещание. Поместите это в начало вашего класса за пределами любых методов.

AlarmReceiver intentReceiver = new AlarmReceiver ();

А вам нужно:

@Override
protected void onPause() {
    // TODO Mark time user logged out
    unregisterReceiver(intentReceiver);
    super.onPause();
}`

И

@Override
protected void onResume() {

    IntentFilter filter = new IntentFilter(CustomAction.MY_INTENT);
    filter.addAction(CustomAction.MY_INTENT);
    registerReceiver(intentReceiver, filter);
    super.onResume();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...