Получатель широковещательной рассылки, установите флажок в настройках при загрузке и отправьте уведомление - PullRequest
0 голосов
/ 16 апреля 2011

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

Код для широковещательного приемника показан ниже:

@Override
public void onReceive(Context context, Intent intent) {
    if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){
        //this creates a reference to my preferences activity   
        Prefs prefsC = new Prefs();

        SharedPreferences prefs = context.getSharedPreferences("Prefs", 0);

        int status = Integer.parseInt(prefs.getString("bootup", "-1"));
        if(status > 0){
            //notifyNS is a method that sends the status bar notification
            prefsC.notifyNS("", R.drawable.n);
            //the setCheckedNS method is just a custom method I made to set the state of a checkbox preference
            prefsC.setCheckedNS("icon", false);
        }else{
            prefsC.setCheckedNS("enable", false);
            prefsC.setCheckedNS("icon", false);
            prefsC.setCheckedNS("bootup", false);
        }
    }

}

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

Это мой ответ в журнале ошибок:

04-16 11:23:15.546: ERROR/AndroidRuntime(977): FATAL EXCEPTION: main
04-16 11:23:15.546: ERROR/AndroidRuntime(977): java.lang.RuntimeException: Unable to instantiate receiver com.brandon.labs.nsettings.receivers.notifyBootup: java.lang.ClassNotFoundException: com.brandon.labs.nsettings.receivers.notifyBootup in loader dalvik.system.PathClassLoader[/data/app/com.brandon.labs.nsettings-1.apk]
04-16 11:23:15.546: ERROR/AndroidRuntime(977):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2913)
04-16 11:23:15.546: ERROR/AndroidRuntime(977):     at android.app.ActivityThread.access$3200(ActivityThread.java:135)
04-16 11:23:15.546: ERROR/AndroidRuntime(977):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2198)
04-16 11:23:15.546: ERROR/AndroidRuntime(977):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-16 11:23:15.546: ERROR/AndroidRuntime(977):     at android.os.Looper.loop(Looper.java:144)
04-16 11:23:15.546: ERROR/AndroidRuntime(977):     at android.app.ActivityThread.main(ActivityThread.java:4937)
04-16 11:23:15.546: ERROR/AndroidRuntime(977):     at java.lang.reflect.Method.invokeNative(Native Method)
04-16 11:23:15.546: ERROR/AndroidRuntime(977):     at java.lang.reflect.Method.invoke(Method.java:521)
04-16 11:23:15.546: ERROR/AndroidRuntime(977):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-16 11:23:15.546: ERROR/AndroidRuntime(977):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-16 11:23:15.546: ERROR/AndroidRuntime(977):     at dalvik.system.NativeStart.main(Native Method)
04-16 11:23:15.546: ERROR/AndroidRuntime(977): Caused by: java.lang.ClassNotFoundException: com.brandon.labs.nsettings.receivers.notifyBootup in loader dalvik.system.PathClassLoader[/data/app/com.brandon.labs.nsettings-1.apk]
04-16 11:23:15.546: ERROR/AndroidRuntime(977):     at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
04-16 11:23:15.546: ERROR/AndroidRuntime(977):     at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
04-16 11:23:15.546: ERROR/AndroidRuntime(977):     at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
04-16 11:23:15.546: ERROR/AndroidRuntime(977):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2904)
04-16 11:23:15.546: ERROR/AndroidRuntime(977):     ... 10 more

Так что я понятия не имею, чтоделать отсюда.

Хорошо, я понял, что я сделал неправильно.Что это такое, как я подключал контекст к методу конструкции messagesManger и методу конструкции Intent.

Вот мой новый и исправленный код, который работает: `открытый класс BootupReceiver extends BroadcastReceiver {

private static final boolean BOOTUP_TRUE = true;
private static final String BOOTUP_KEY = "bootup";

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

    if(getBootup(context)) {
        Toast toast2 = Toast.makeText(context, "getBootup", Toast.LENGTH_SHORT);
        toast2.show();

        NotificationManager NotifyM = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        Notification Notify = new Notification(R.drawable.n,
                "NSettings Enabled", System.currentTimeMillis());

        Notify.flags |= Notification.FLAG_NO_CLEAR;
        Notify.flags |= Notification.FLAG_ONGOING_EVENT;

        RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.notification);
        Notify.contentView = contentView;

        Intent notificationIntent = new Intent(context, Toggles.class);
        PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
        Notify.contentIntent = contentIntent;

        Toast toast = Toast.makeText(context, "Notify about to be sent", Toast.LENGTH_SHORT);
        toast.show();

                    int HELO_ID = 00000;

        NotifyM.notify(HELLO_ID, Notify);
        Toast toast1 = Toast.makeText(context, "Notify sent", Toast.LENGTH_SHORT);
        toast1.show();
    }

    Intent serviceIntent = new Intent();
    serviceIntent.setAction("com.brandon.labs.nsettings.NotifyService");
    context.startService(serviceIntent);
}

public static boolean getBootup(Context context){
    return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(BOOTUP_KEY, BOOTUP_TRUE);
}

} `

Поскольку этот вопрос получил более 100 просмотров, я подумал, что было бы неплохо опубликовать код, который работает должным образом.

Примечание: я не знаю, почему закрытиефигурная скобка для класса не отображается вместе с остальным кодом, это ошибка переполнения стека

Ответы [ 2 ]

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

Вы добавили следующее в ваш AndroidManifest.xml вместе с регистрацией BroadcastReceiver ??

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

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

Согласно журналу ('java.lang.RuntimeException: Невозможно создать экземпляр получателя'), система не может создать экземпляр вашего класса получателя, потому что система не может найти указанный класс (com.brandon.labs.nsettings.receivers.notifyBootup).Я думаю, что это, вероятно, проблемы с именем (класса получателя) в вашем файле AndroidManifest.xml, и это не связано с предпочтениями.

В будущем, если вы получите еще одно исключение, я рекомендую вам внимательно прочитатьсообщение об исключении;) и трассировка стека.Обычно они содержат половину ответа на ваш вопрос.И из-за популярных ошибок - вы можете попытаться ввести текст исключения в Google (исключая некоторую конкретную информацию, такую ​​как название класса), и вы найдете решение очень быстро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...