Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android BroadcastReceiver无法在应用程序关闭/关闭时显示通知_Android_Notifications_Broadcastreceiver_Alarm_Android Broadcastreceiver - Fatal编程技术网

Android BroadcastReceiver无法在应用程序关闭/关闭时显示通知

Android BroadcastReceiver无法在应用程序关闭/关闭时显示通知,android,notifications,broadcastreceiver,alarm,android-broadcastreceiver,Android,Notifications,Broadcastreceiver,Alarm,Android Broadcastreceiver,我的任务是设置一个警报,以触发接收器在特定时间显示通知 如果应用程序处于打开状态或仅在后台运行,则代码可以完美运行 在关闭应用程序时,执行警报时仍可以触发接收器 但是,没有显示任何通知 我能做什么 报警功能: public static void makeAlarm(Context context,Date date) { Log.i("Alarm", "makeAlarm"); AlarmManager alarmMgr; PendingIntent alarmInte

我的任务是设置一个警报,以触发接收器在特定时间显示通知

如果应用程序处于打开状态或仅在后台运行,则代码可以完美运行

在关闭应用程序时,执行警报时仍可以触发接收器

但是,没有显示任何通知

我能做什么

报警功能:

public static void makeAlarm(Context context,Date date) {
    Log.i("Alarm", "makeAlarm");
    AlarmManager alarmMgr;
    PendingIntent alarmIntent;
    alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, AlarmReceiver.class);
    alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
    alarmMgr.set(AlarmManager.RTC_WAKEUP,
            date.getTime(), alarmIntent);
}
报警接收器

public class AlarmReceiver extends BroadcastReceiver {
    public AlarmReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
                Log.i("Alarm", "onReceive");
                android.support.v4.app.NotificationCompat.Builder mBuilder =
                        new NotificationCompat.Builder(context)
                                .setSmallIcon(R.drawable.app_logo)
                                .setContentTitle("Title")
                                .setContentText("Message");

                Intent resultIntent = new Intent(context, MainActivity.class);
                TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
                stackBuilder.addParentStack(MainActivity.class);
                stackBuilder.addNextIntent(resultIntent);
                PendingIntent resultPendingIntent =
                        stackBuilder.getPendingIntent(
                                0,
                                PendingIntent.FLAG_UPDATE_CURRENT
                        );
                mBuilder.setContentIntent(resultPendingIntent);
                NotificationManager mNotificationManager =
                        (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
                Random rand = new Random();
                mNotificationManager.notify(rand.nextInt(), mBuilder.build());

    }
}
Manifest.xml

<receiver
    android:name=".receiver.AlarmReceiver"
    android:enabled="true"
    android:exported="true" />

当您使用-

alarmMgr.set(AlarmManager.RTC_WAKEUP,date.getTime(), alarmIntent);
我想您的date.getTIme()正在检索当前时间。因此,当尝试执行报警时,触发时间将已经过去。更好的是,你可以做一些延迟(比如说,五秒钟)来触发你的闹钟。用电话就行了-

alarmMgr.set(AlarmManager.RTC_WAKEUP,date.getTime() + 5*1000, alarmIntent);

请运行示例代码。我想它能按你的要求工作

public class MainActivity extends AppCompatActivity {

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

    setUpAlarm(10 * 1000);
}
public void setUpAlarm(long triggerTimeInMS) {
    AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, AlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1,  intent, 0);
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+triggerTimeInMS , pendingIntent);
}
}
创建receiver类-

public class AlarmReceiver extends BroadcastReceiver {
private String TAG = "AlarmLog";

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

    Toast.makeText(context, "Incoming Call Received", Toast.LENGTH_LONG).show();

    showNotification(context);

}

private void showNotification(Context context) {
    Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

    NotificationCompat.Builder mBuilder =   new NotificationCompat.Builder(context)
            .setSmallIcon(R.drawable.alarm)
            .setContentTitle("Notification!") // title for notification
            .setContentText("Alarm Received")
            .setSound(soundUri)// message for notification
            .setAutoCancel(true); // clear notification after click
        NotificationManager mNotificationManager =
            (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.notify(0, mBuilder.build());
}
}
别忘了注册一下听筒。在manifest.xml中放入以下代码-

    <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    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="com.example.shajib.alarmtest.AlarmReceiver" />
</application>


@Seasons:r您确定从后台杀死应用程序时会调用onReceive()吗?@kevz我确定onReceive()会被触发,因为我可以看到onReceive()中的logstry to Toast消息,因为通知代码看起来不错。@kevz尝试过,但仍然没有toastalright,所以onReceive()不会被调用。需要检查Y报警是否未触发。不,这不是当前时间。日期时间设置为10秒后的未来时间