我关闭应用程序时未显示通知

时间:2018-12-05 03:29:07

标签: java android notifications

因此,我编写了一些代码,使应用程序在指定的时间显示。当应用在屏幕上打开时,它运行良好,但是当它关​​闭时,它根本不起作用。我需要帮助使其显示出来。

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);
}

扩展了BroadcastReceiver的MyReceiver.java的代码:

public MyReceiver() {

}

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

扩展了IntentService的MyNewIntentService的代码:

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 :(得分:0)

尝试

  • firebase通知有两种类型:

    数据消息:当您的应用背景/前景/杀死了您的推送通知时

    显示消息:当您的应用程序前台推送通知有效时

在这些阶段处理推送通知背景/前景/已杀死

这取决于您的 json响应,请确保您的json响应如下:

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

这是我的代码,当您的应用背景/前景/已终止正常运行

  @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>

我希望它对您有帮助