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 允许您传递额外的数据,例如操作(对 IntentFilters 有用)或附加信息。因为你没有设置任何东西,所以第一次执行会转到 onHandleIntent() 方法的 else 分支。 AlarmManager 将在 15 分钟内与 serviceIntent 安排 运行 您的服务。注意 serviceIntent.setAction(ACTION_CANCEL_NOTIFS)。所以第二次执行转到 if 分支并取消通知。

更好的方法是直接从您的 activity 内部创建待定意图,而不是使用 startService 启动服务。这将使您的服务更简单、更有凝聚力。