Приемник уведомлений и трансляции Android и JobScheduler - PullRequest
0 голосов
/ 27 февраля 2019

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

Теория, которую я хочу сделать, проста в теории: каждый день в 10:00 я хочу, чтобы android запускал определенный коди чтобы уведомить пользователя, когда он что-то найдет или нет.

Я использую Alarm Manager и Notification Manager.

Я нашел несколько хороших примеров, и они оба работают хорошо!НО мне нужна эта недостающая ссылка !!

Основная деятельность:

public class MainActivity extends AppCompatActivity {

private PendingIntent pendingIntent;
Button btnStart;
Button btnStop;
Button btnStart10;

private NotificationManagerCompat notificationManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    notificationManager = NotificationManagerCompat.from(this);

    btnStart = (Button) findViewById(R.id.startAlarm);

    /* Retrieve a PendingIntent that will perform a broadcast */
    Intent alarmIntent = new Intent(MainActivity.this, MyBroadcastReceiver.class);
    pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, alarmIntent, 0);


    findViewById(R.id.stopAlarm).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            cancel();
        }
    });

    findViewById(R.id.startAlarmAt10).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startAt10();
        }
    });
}

public void cancel() {
    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    manager.cancel(pendingIntent);
    Toast.makeText(this, "Alarm Canceled", Toast.LENGTH_SHORT).show();
}

public void startAt10() {
    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    int interval = 1000 * 60;// * 20;
    Log.e("Hello", "hello");
    /* Set the alarm to start at 10:00 AM */
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, 10);
    calendar.set(Calendar.MINUTE, 00);

    /* Repeating interval */
    manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
            AlarmManager.INTERVAL_DAY, pendingIntent);
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.e("Hello", "good bye");
    cancel();
}

public void sendOnChannel1(View v) {
    String title = "Title 1";
    String message = "This is a message for channel 1";

    Notification notification = new NotificationCompat.Builder(this, App.CHANNEL_1_ID)
            .setSmallIcon(R.drawable.ic_launcher_foreground)
            .setContentTitle(title)
            .setContentText(message)
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
            .setCategory(NotificationCompat.CATEGORY_EVENT)
            .build();

    notificationManager.notify(1, notification);
}

}

Вот мой широковещательный приемник:

public class MyBroadcastReceiver extends BroadcastReceiver {

MainActivity mainActivity;

@Override
public void onReceive(Context context, Intent intent) {
    Toast.makeText(context, "Alarm....", Toast.LENGTH_LONG).show();
    Log.e("Hello","hello2");

    mainActivity = new MainActivity();
    mainActivity.sendOnChannel1();
}

}

Я почти уверен, что я там делал "mainActivity = new MainActivity ();"это не хорошее программирование.НО я получаю исключение нулевого указателя ...

/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.notifications1, PID: 13954
java.lang.RuntimeException: Unable to start receiver com.example.notifications1.MyBroadcastReceiver: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
    at android.app.ActivityThread.handleReceiver(ActivityThread.java:3388)
    at android.app.ActivityThread.access$1200(ActivityThread.java:199)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1661)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
    at android.content.ContextWrapper.getResources(ContextWrapper.java:91)
    at android.view.ContextThemeWrapper.getResourcesInternal(ContextThemeWrapper.java:127)
    at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:121)
    at android.support.v7.app.AppCompatActivity.getResources(AppCompatActivity.java:543)
    at android.app.Notification$Builder.<init>(Notification.java:3246)
    at android.app.Notification$Builder.<init>(Notification.java:3228)
    at android.support.v4.app.NotificationCompatBuilder.<init>(NotificationCompatBuilder.java:65)
    at android.support.v4.app.NotificationCompat$Builder.build(NotificationCompat.java:1585)
    at com.example.notifications1.MainActivity.sendOnChannel1(MainActivity.java:114)
    at com.example.notifications1.MyBroadcastReceiver.onReceive(MyBroadcastReceiver.java:22)
    at android.app.ActivityThread.handleReceiver(ActivityThread.java:3379)
    at android.app.ActivityThread.access$1200(ActivityThread.java:199) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1661) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:193) 
    at android.app.ActivityThread.main(ActivityThread.java:6669) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

Я планировал использовать JobScheduler (для запуска кода для сравнения, если уведомление нужно или нет) в broadcastReceiver.java, это хорошая практика?

Я пытался получить контекст или приложение.Я просто устал искать ... Пожалуйста, помогите!

Заранее спасибо!

Тони

1 Ответ

0 голосов
/ 13 марта 2019

Вы не должны явно создавать действия (или службу, или широковещательные приемники).Система Android делает это внутренне.Правильный способ построения действия - через startActivity () с намерением;не стесняйтесь добавлять дополнительные параметры к этому намерению.

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