首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >关闭应用程序后不显示我的通知

关闭应用程序后不显示我的通知
EN

Stack Overflow用户
提问于 2018-03-27 15:34:00
回答 1查看 64关注 0票数 0

我有一个将在自定义时间和日期中显示的通知,一切正常,但当应用程序关闭时,通知不再显示。我使用了AlarmManager来显示特定时间的通知。

MainActivity.java

代码语言:javascript
复制
import android.app.AlarmManager;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.RingtoneManager;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.util.Calendar;

public class MainActivity extends AppCompatActivity {

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

        AlarmManager alarmManager=(AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
        Receiver receiver=new Receiver();
        IntentFilter intentFilter=new IntentFilter("ALARM_ACTION");
        registerReceiver(receiver, intentFilter);
        Intent intent = new Intent("ALARM_ACTION");
        intent.putExtra("param", "My scheduled action");
        PendingIntent operation = PendingIntent.getBroadcast(this, 0, intent, 0);

        Calendar calendar=Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.clear();
        calendar.set(Calendar.DATE,26);
        calendar.set(Calendar.MONTH,Calendar.MARCH);
        calendar.set(Calendar.YEAR,2018);
        calendar.set(Calendar.HOUR_OF_DAY, 16);
        calendar.set(Calendar.MINUTE, 52);
        calendar.set(Calendar.SECOND, 0);

        alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), operation) ;
    }

    private void addNotification() {
        Intent intent = new Intent(this, SecondActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "ChannelID");
        builder.setSmallIcon(R.drawable.ic_launcher_background);
        builder.setContentTitle("Notifications Example");
        builder.setContentText("This is a test notification");
        builder.setContentIntent(pendingIntent);
        builder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));
        builder.setAutoCancel(true);

        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(0, builder.build());
    }

    public class Receiver extends BroadcastReceiver{

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

AndroidManifest.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.arantik.test">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver
            android:name=".Receiver"
            android:enabled="true"
            android:exported="true"
            android:label="StartMyServiceAtBootReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <activity android:name=".SecondActivity"></activity>

    </application>

</manifest>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-27 15:40:06

不要从你的活动中调用registerReceiver(),当你关闭应用程序时,接收器会死掉。您需要在您的清单中声明接收者。并使用receiver作为独立的类,而不是内部类。 AlarmManager将使用PendingIntent数据调用您的receiver。这样设置您的PendingIntent,并将以下方法添加到您的Activity中,然后像这样从onCreate中调用它:

代码语言:javascript
复制
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    AlarmManager alarmManager=(AlarmManager)this.getSystemService(Context.ALARM_SERVICE);

    Intent alarmIntent = new Intent(getApplicationContext(), YourReceiver.class);
    PendingIntent operation = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    Calendar calendar=Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.clear();
    calendar.set(Calendar.DATE,26);
    calendar.set(Calendar.MONTH,Calendar.MARCH);
    calendar.set(Calendar.YEAR,2018);
    calendar.set(Calendar.HOUR_OF_DAY, 16);
    calendar.set(Calendar.MINUTE, 52);
    calendar.set(Calendar.SECOND, 0);

    registerOneTimeAlarm(operation, calendar.getTimeInMillis());
}

private void registerOneTimeAlarm(PendingIntent alarmIntent, long when) {
    int SDK_INT = Build.VERSION.SDK_INT;
    if (SDK_INT < Build.VERSION_CODES.KITKAT) {
        alarmManager.set(AlarmManager.RTC_WAKEUP, when, alarmIntent);
    } else if (Build.VERSION_CODES.KITKAT <= SDK_INT && SDK_INT < Build.VERSION_CODES.M) {
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, when, alarmIntent);
    } else if (SDK_INT >= Build.VERSION_CODES.M) {
        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, when, alarmIntent);
    }
}

这种方法对Android的新限制有更好的支持。

将接收者添加到您的清单中,以便可以显式触发:

代码语言:javascript
复制
<receiver
        android:name=".YourReceiver"
        android:enabled="true"
        />

将addNotification()方法放在receiver类中,或者启动一个将调用此方法的服务,这不是一个很长的操作,所以我将把它放在receiver类中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49506887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档