IntentService 不工作
IntentService not working
我正在构建一个应用程序,通知将在特定时间响铃,如果 15 分钟无人看管,通知就会消失。当我插入我的设备并输入 运行 代码时,它会起作用。但是,一旦我拔下我的设备并 运行s 应用程序,通知就会起作用,但如果无人看管,它不会在 15 分钟后消失。请告诉我我应该如何 运行 应用程序就像设备插入计算机时的表现一样。此外,它应该在应用程序被终止时工作。
仅供参考,我正在使用通知、alarmmanager、广播接收器和 intentservice。下面是我的代码片段。
AlarmReceiver.java
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Notification(context, "Wifi Connection On");
Intent background = new Intent(context, BackgroundService.class);
context.startService(background);
}
public void Notification(final Context context, String message) {
// notification codes
}
}
BackgroundService.java
public class BackgroundService extends IntentService {
public BackgroundService() {
super("BackgroundService");
}
@Override
protected void onHandleIntent(Intent intent) {
//countdown 15 minutes and cancel notification automatically
Timer timer=new Timer();
TimerTask task=new TimerTask() {
@Override
public void run() {
// Create Notification Manager
NotificationManager notificationmanager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// Dismiss Notification
notificationmanager.cancelAll();
}
};
timer.schedule(task, 900000);
}
}
Manifest.xml
<receiver android:name=".AlarmReceiver" android:process=":remote" />
<service android:name=".BackgroundService" />
请给我一些建议。谢谢你。
服务仅在 运行 秒时 CPU 处于唤醒状态。如果CPU下车,服务不会运行。
如果 phone 进入睡眠状态,那么要使您的服务 运行,您需要获取唤醒锁。
后台服务class
public class BackgroundService extends IntentService {
private PowerManager.WakeLock wl;
public BackgroundService() {
super("BackgroundService");
}
@Override
protected void onHandleIntent(Intent intent) {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Partial lock permission");
wl.acquire();
//countdown 15 minutes and cancel notification automatically
Timer timer=new Timer();
TimerTask task=new TimerTask() {
@Override
public void run() {
// Create Notification Manager
NotificationManager notificationmanager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// Dismiss Notification
notificationmanager.cancelAll();
wl.release();
}
};
timer.schedule(task, 900000);
}
}
如果确实可行,请尝试在 Android 清单文件
中授予以下权限
<uses-permission android:name="android.permission.WAKE_LOCK" />
此服务将 运行 两次:第一次它除了重新安排什么都不做,第二次它取消通知。
public class BackgroundService extends IntentService {
private static final int REQUEST_CODE = 42;
private static final String ACTION_CANCEL_NOTIFS = "CancelNotifications";
public BackgroundService() {
super("BackgroundService");
}
@Override
protected void onHandleIntent(Intent intent) {
if (intent != null && ACTION_CANCEL_NOTIFS.equals(intent.getAction())) {
NotificationManager notificationmanager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationmanager.cancelAll();
}
else {
reschedule();
}
}
private void reschedule() {
final Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.MINUTE, 15);
final Intent serviceIntent = new Intent(this, getClass());
serviceIntent.setAction(ACTION_CANCEL_NOTIFS);
PendingIntent pendingIntent = PendingIntent.getService(this, REQUEST_CODE, serviceIntent, PendingIntent.FLAG_UPDATE_CURRENT);
final AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
}
}
解释:
我假设在您的代码中,您使用 startService(new Intent(this, BackgroundService.class))
启动服务。此意图在 onHandleIntent(Intent)
中作为参数传递,这意味着您可以从服务内部访问它。
Intent 允许您传递额外的数据,例如操作(对 IntentFilter
s 有用)或附加信息。因为你没有设置任何东西,所以第一次执行会转到 onHandleIntent()
方法的 else
分支。 AlarmManager
将在 15 分钟内与 serviceIntent
安排 运行 您的服务。注意 serviceIntent.setAction(ACTION_CANCEL_NOTIFS)
。所以第二次执行转到 if
分支并取消通知。
更好的方法是直接从您的 activity 内部创建待定意图,而不是使用 startService
启动服务。这将使您的服务更简单、更有凝聚力。
我正在构建一个应用程序,通知将在特定时间响铃,如果 15 分钟无人看管,通知就会消失。当我插入我的设备并输入 运行 代码时,它会起作用。但是,一旦我拔下我的设备并 运行s 应用程序,通知就会起作用,但如果无人看管,它不会在 15 分钟后消失。请告诉我我应该如何 运行 应用程序就像设备插入计算机时的表现一样。此外,它应该在应用程序被终止时工作。
仅供参考,我正在使用通知、alarmmanager、广播接收器和 intentservice。下面是我的代码片段。
AlarmReceiver.java
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Notification(context, "Wifi Connection On");
Intent background = new Intent(context, BackgroundService.class);
context.startService(background);
}
public void Notification(final Context context, String message) {
// notification codes
}
}
BackgroundService.java
public class BackgroundService extends IntentService {
public BackgroundService() {
super("BackgroundService");
}
@Override
protected void onHandleIntent(Intent intent) {
//countdown 15 minutes and cancel notification automatically
Timer timer=new Timer();
TimerTask task=new TimerTask() {
@Override
public void run() {
// Create Notification Manager
NotificationManager notificationmanager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// Dismiss Notification
notificationmanager.cancelAll();
}
};
timer.schedule(task, 900000);
}
}
Manifest.xml
<receiver android:name=".AlarmReceiver" android:process=":remote" />
<service android:name=".BackgroundService" />
请给我一些建议。谢谢你。
服务仅在 运行 秒时 CPU 处于唤醒状态。如果CPU下车,服务不会运行。
如果 phone 进入睡眠状态,那么要使您的服务 运行,您需要获取唤醒锁。
后台服务class
public class BackgroundService extends IntentService {
private PowerManager.WakeLock wl;
public BackgroundService() {
super("BackgroundService");
}
@Override
protected void onHandleIntent(Intent intent) {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Partial lock permission");
wl.acquire();
//countdown 15 minutes and cancel notification automatically
Timer timer=new Timer();
TimerTask task=new TimerTask() {
@Override
public void run() {
// Create Notification Manager
NotificationManager notificationmanager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// Dismiss Notification
notificationmanager.cancelAll();
wl.release();
}
};
timer.schedule(task, 900000);
}
}
如果确实可行,请尝试在 Android 清单文件
中授予以下权限<uses-permission android:name="android.permission.WAKE_LOCK" />
此服务将 运行 两次:第一次它除了重新安排什么都不做,第二次它取消通知。
public class BackgroundService extends IntentService {
private static final int REQUEST_CODE = 42;
private static final String ACTION_CANCEL_NOTIFS = "CancelNotifications";
public BackgroundService() {
super("BackgroundService");
}
@Override
protected void onHandleIntent(Intent intent) {
if (intent != null && ACTION_CANCEL_NOTIFS.equals(intent.getAction())) {
NotificationManager notificationmanager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationmanager.cancelAll();
}
else {
reschedule();
}
}
private void reschedule() {
final Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.MINUTE, 15);
final Intent serviceIntent = new Intent(this, getClass());
serviceIntent.setAction(ACTION_CANCEL_NOTIFS);
PendingIntent pendingIntent = PendingIntent.getService(this, REQUEST_CODE, serviceIntent, PendingIntent.FLAG_UPDATE_CURRENT);
final AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
}
}
解释:
我假设在您的代码中,您使用 startService(new Intent(this, BackgroundService.class))
启动服务。此意图在 onHandleIntent(Intent)
中作为参数传递,这意味着您可以从服务内部访问它。
Intent 允许您传递额外的数据,例如操作(对 IntentFilter
s 有用)或附加信息。因为你没有设置任何东西,所以第一次执行会转到 onHandleIntent()
方法的 else
分支。 AlarmManager
将在 15 分钟内与 serviceIntent
安排 运行 您的服务。注意 serviceIntent.setAction(ACTION_CANCEL_NOTIFS)
。所以第二次执行转到 if
分支并取消通知。
更好的方法是直接从您的 activity 内部创建待定意图,而不是使用 startService
启动服务。这将使您的服务更简单、更有凝聚力。