Уведомление не отображается при закрытии приложения - PullRequest
0 голосов
/ 05 декабря 2018

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

Код для MainActivity.java:

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

    initChannels(this);
    alarmMgr = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, MyReceiver.class);
    alarmIntent = PendingIntent.getBroadcast(this, 0, intent, 0);

    // Set the alarm to start at 8:30 a.m.
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, 9);
    calendar.set(Calendar.MINUTE, 00);

    // setRepeating() lets you specify a precise custom interval--in this case,
    // 20 minutes.
    alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
            AlarmManager.INTERVAL_DAY, alarmIntent);
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}

Код для MyReceiver.java, который расширяет BroadcastReceiver:

public MyReceiver() {

}

@Override
public void onReceive(Context context,Intent intent) {
    Intent intent1 = new Intent(context, MyNewIntentService.class);
    context.startService(intent1);
}

Код для MyNewIntentServiceкоторый расширяет IntentService:

private static final int notificationId = 4242;

public MyNewIntentService() {
    super("MyNewIntentService");
}

@Override
protected void onHandleIntent(Intent intent) {
    //NOTIFICATION CREATION
    // Create an explicit intent for an Activity in your app
    Intent notifyIntent = new Intent(this, MainActivity.class);
    notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notifyIntent, 0);

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, "default")
            .setSmallIcon(R.drawable.ic_launcher_foreground)
            .setContentTitle("This is the title")
            .setContentText("This is the body of the notification.")
            .setVisibility(VISIBILITY_PUBLIC)
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
            // Set the intent that will fire when the user taps the notification
            .setContentIntent(pendingIntent)
            .setAutoCancel(true);

    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
    // notificationId is a unique int for each notification that you must define
    notificationManager.notify(notificationId, mBuilder.build());
}

И я добавил это в AndroidManifest.xml:

<receiver
        android:name=".MyReceiver"
        android:enabled="true"
        android:exported="false" >
    </receiver>
    <service
        android:name=".MyNewIntentService"
        android:exported="false" >
    </service>

Я знаю, что в этом вопросе много текста, и я извиняюсь за это, но ядумаю, вам будет легче помочь мне или понять, в чем проблема.

1 Ответ

0 голосов
/ 05 декабря 2018

попробуйте это

  • Уведомление Firebase бывает двух типов:

    сообщение данных: когда фон вашего приложения / передний план / убит, ваше push-уведомлениеработал

    отображать сообщение: когда работает push-уведомление переднего плана вашего приложения

Обрабатывать push-уведомления на этих этапах background / foreground / kill

это зависит от вашего ответа json убедитесь, что ваш ответ json выглядит следующим образом:

{
 "to": "registration_ids",
 "data": {
 "key": "value",
 "key": "value",
 "key": "value",
 "key": "value"
 }
 }

это мой код, когда ваше приложение background / foreground / kill работает нормально

  @Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    Log.e(TAG, "remoteMessage......" + remoteMessage.getData());
    try {
        Map<String, String> params = remoteMessage.getData();
        JSONObject object = new JSONObject(params);
        Log.e(TAG, object.toString());
        body = object.getString("not_id");
        dataa = object.getString("data");
        title = object.getString("not_type");
        type = object.getString("type");
        Sender = object.getString("Sender");
        SenderProfileUrl = object.getString("SenderProfileUrl");

    wakeUpScreen();
    addNotification(remoteMessage.getData());

}

/* when your phone is locked screen wakeup method*/
private void wakeUpScreen() {
    PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
    boolean isScreenOn = pm.isScreenOn();

    Log.e("screen on......", "" + isScreenOn);
    if (isScreenOn == false) {
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, "MyLock");
        wl.acquire(10000);
        PowerManager.WakeLock wl_cpu = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyCpuLock");
        wl_cpu.acquire(10000);
    }
}

/*Add notification method use for add icon and title*/
private void addNotification(Map<String, String> data) {
    int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ?R.drawable.logo_app: R.drawable.logo_app;
    NotificationCompat.Builder builder =
            new NotificationCompat.Builder(this)
                    .setSmallIcon(icon)
                    //.setSmallIcon(R.drawable.logout_icon)
                    .setContentTitle(data.get("title") + "")
                    .setChannelId("channel-01")
                    .setAutoCancel(true)
                    .setSound(uri)
                    .setContentText(data.get("body") + "");

    Notification notification = new Notification();

    Log.e(TAG, "titlee" + data.get("title"));

    // Cancel the notification after its selected
    notification.flags |= Notification.FLAG_AUTO_CANCEL;
    if (sound)
        notification.defaults |= Notification.DEFAULT_SOUND;

    if (vibration)
        notification.defaults |= Notification.DEFAULT_VIBRATE;

    builder.setDefaults(notification.defaults);

     }
    }

когда я нажимаю на панель уведомлений, переходите на конкретный экран, используя такой тип:

    /*notification send with type calling */
            if (data.get("not_type").equals("calling")) {
                if (data.get("type").equals("name")) {
                    Log.e(TAG, "ttt--" + type);
                    Intent notificationIntent = new Intent(this, CallingActivity.class);
                    notificationIntent.putExtra("notification_room_id", body);
                    notificationIntent.putExtra("data", dataa);
                    notificationIntent.putExtra("calling", "calling");

                    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
                    builder.setContentIntent(contentIntent);
                    builder.setSound(uri);
                    builder.setAutoCancel(true);

                    // Add as notification
                    NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                        CharSequence name = "Hello";// The user-visible name of the channel.
                        int importance = NotificationManager.IMPORTANCE_HIGH;
                        NotificationChannel mChannel = new NotificationChannel("channel-01", name, importance);
                        manager.createNotificationChannel(mChannel);
                    }
                    manager.notify((int) ((new Date().getTime() / 1000L) % Integer.MAX_VALUE), builder.build());

                }

это мой класс уведомлений о добавлении и класс токенов

 <service android:name=".notification.NotificationService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
    <service android:name=".notification.TokenService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>
    <service
        android:name=".notification.NLService"
        android:label="@string/app_name"
        android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
        <intent-filter>
            <action android:name="android.service.notification.NotificationListenerService" />
        </intent-filter>
    </service>

надеюсь, это поможет вам

...