Приложението се срива при извикване на BroadcastReceiver

Имам два малки въпроса;

  1. BroadcastReceiver на моето приложение работи добре, когато приложението работи, получавам перфектно тост съобщението „Вторник в 2“ и то актуализира приложението, но когато затворя приложението си, това означава, че приложението спира да работи, не се извиква, а вместо това той се срива „Вашето приложение спря да работи“, така че знае, че трябва да го извика, но не го прави, нали?

  2. Изглежда, че BroadcastReceiver се обажда всеки ден около 14:00, не само във вторник в 14:00, искам приложението да се актуализира веднъж седмично. Може би защото извиквам моя метод setAlarm() на onCreate на моя UpcomingFragment?

В класа UpcomingFragment (където настройвам алармата да звъни всеки вторник в 2)

 private void setAlarm(){
    AlarmManager alarmMgr = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(getActivity(), UpdateReceiver.class);
    intent.putExtra("greeting", "Hello");
    PendingIntent alarmIntent = PendingIntent.getBroadcast(getActivity(), 0, intent, 0);

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
    calendar.set(Calendar.HOUR_OF_DAY, 14);

    // With setInexactRepeating(), you have to use one of the AlarmManager interval
    // constants--in this case, AlarmManager.INTERVAL_DAY.
    alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
            AlarmManager.INTERVAL_DAY, alarmIntent);
}

В onReceive() на BroadcastReceiver

public class UpdateReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
         UpcomingFragment.getInstance().update();
         //if tuesday
         Toast.makeText(context, "Tuesday at 2" , Toast.LENGTH_LONG).show();
   }
}

Манифест:

<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

 <receiver android:name=".UpdateReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"></action>
        </intent-filter>
    </receiver>

не мога да ви осигуря logcat, защото той не го отпечатва, когато го осребри, не знам дали моето андроид студио е виновно тук или моето приложение. Благодаря!


person Community    schedule 14.11.2015    source източник
comment
Означава UpcomingFragment.getInstance().update(); ред, причиняващ проблем   -  person ρяσѕρєя K    schedule 14.11.2015


Отговори (1)


Не можете да манипулирате Fragments в контекста на BroadCastReceiver. По същество излъчващите приемници се изпълняват в контекста на приложението и в който не можете да получите достъп до неща от потребителския интерфейс.

Ако искате да започнете дейност, след като това излъчване бъде задействано, ще ви трябва следният код:

Intent intent = new Intent(context, MyActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);

Забележка: Достъпът до потребителския интерфейс (включително фрагменти) трябва да се извършва в контекст на дейност.


Актуализация #1

Изглежда, че BroadcastReceiver се обажда всеки ден около 14:00, а не само във вторник в 14:00, искам приложението да се актуализира веднъж седмично. Може би защото извиквам моя метод setAlarm() на onCreate на моя UpcomingFragment?

Мисля, че имам по-добър подход от твоя.

За първото вашите кодове за планиране трябва да настроят алармата до най-близкия вторник в 14:00 часа. За това, този отговор може да бъде полезно.

За последното първо добавете следното разрешение към вашия манифестен файл.

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

След това дефинирайте друг излъчващ приемник и го декларирайте във файла на манифеста.

<receiver android:name="your.package.name.BootCompletedReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

В новосъздадения приемник за излъчване добавете този код.

@Override
public void onReceive(Context context, Intent intent) {
    // Set the alarm to coming Tuesday on 2 PM
}

Това гарантира, че приложението ви ще се актуализира всеки вторник в 14:00 часа при всякакви обстоятелства.

person frogatto    schedule 14.11.2015
comment
Много ти благодаря, приятелю, имаш ли нещо против или имаш ли най-малка идея относно втория въпрос отгоре? - person ; 15.11.2015
comment
но какво ще стане, ако потребителят не отвори телефона си във вторник, нито приложението? - person ; 15.11.2015
comment
@MadBoy О, прав си! Трябва да промените малко този код, за да разрешите този проблем. - person frogatto; 15.11.2015
comment
@MadBoy stackoverflow.com/questions/13227035/ - person frogatto; 15.11.2015