AlarmManager单独运行,但不在JobSchedule中运行

问题描述 投票:0回答:1

MainActivity中由AlarmManager处理的前2个警报按预期方式工作,但是JobScheduler中由AlarmManager处理的2个警报应该每10秒生效一次,这似乎没有效果。我在logcat中没有任何内容可以指示我应该去哪里。关于我可能要去哪里的任何想法?

MainActvity:

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "Notifications";

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

        Calendar c = Calendar.getInstance();
        Integer currentHour = c.get(Calendar.HOUR_OF_DAY);
        Integer currentMinute = c.get(Calendar.MINUTE);
        Integer currentSecond = c.get(Calendar.SECOND);
        Toast.makeText(this, String.valueOf(currentSecond), Toast.LENGTH_SHORT).show();

        setAlarm("Gym", currentHour,currentMinute,currentSecond + 3,1);
        setAlarm("Swimming", currentHour,currentMinute,currentSecond + 6,2);
        scheduleJob();
    }

    public void setAlarm(String activity, Integer hour, Integer minute, Integer second, Integer requestCode) {
        Calendar currentTime = Calendar.getInstance();
        Calendar c = Calendar.getInstance();
        c.set(Calendar.HOUR_OF_DAY, hour);
        c.set(Calendar.MINUTE, minute);
        c.set(Calendar.SECOND, second);

        if (c.after(currentTime)) {
            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
            intent.putExtra("Activity", activity);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), requestCode, intent, 0);

            alarmManager.setExact(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pendingIntent);
            // alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
        }
    }
    public void scheduleJob() {
        ComponentName componentName = new ComponentName(this, NotificationService.class);
        JobInfo jobInfo = new JobInfo.Builder(123, componentName)
                .setRequiresCharging(true)
                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
                .setPersisted(true)
                .setPeriodic(1000 * 10)
                .build();
        JobScheduler jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);

        int resultCode = jobScheduler.schedule(jobInfo);
        if (resultCode == JobScheduler.RESULT_SUCCESS) {
            Log.d(TAG, "Job scheduled");
        } else {
            Log.d(TAG, "Job scheduling failed");
        }
    }
}

JobService:

public class NotificationService extends JobService {

    @Override
    public boolean onStartJob(JobParameters parameters) {
        doBackgroundWork(parameters);
        return true;
    }

    private void doBackgroundWork(final JobParameters parameters) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                Calendar c = Calendar.getInstance();
                Integer currentHour = c.get(Calendar.HOUR_OF_DAY);
                Integer currentMinute = c.get(Calendar.MINUTE);
                Integer currentSecond = c.get(Calendar.SECOND);

                setAlarm("Gym", currentHour,currentMinute,currentSecond + 3,1);
                setAlarm("Swimming", currentHour,currentMinute,currentSecond + 6,2);
                jobFinished(parameters, false);
            }
        }).start();
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return false;
    }

    public void setAlarm(String activity, Integer hour, Integer minute, Integer second, Integer requestCode) {
        Calendar currentTime = Calendar.getInstance();
        Calendar c = Calendar.getInstance();
        c.set(Calendar.HOUR_OF_DAY, hour);
        c.set(Calendar.MINUTE, minute);
        c.set(Calendar.SECOND, second);

        if (c.after(currentTime)) {
            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
            intent.putExtra("Activity", activity);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), requestCode, intent, 0);

            alarmManager.setExact(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pendingIntent);
            // alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
        }
    }
}

BroadcastReceiver:

public class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String activity = intent.getExtras().getString("Activity");

        NotificationHelper notificationHelper = new NotificationHelper(context);
        NotificationCompat.Builder nb = notificationHelper.getChannelNotification(activity);
        notificationHelper.getManager().notify(1, nb.build());
    }
}

NotificationHelper:

public class NotificationHelper extends ContextWrapper {

    public static final String channelID = "channelID";
    public static final String channelName = "Channel";
    private NotificationManager mManager;

    public NotificationHelper(Context base) {
        super(base);
        createChannels();
    }

    private void createChannels() {
        NotificationChannel channel = new NotificationChannel(channelID, channelName, NotificationManager.IMPORTANCE_DEFAULT);
        channel.enableLights(true);
        channel.enableVibration(true);
        channel.setLightColor(R.color.royalBlue);
        channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);

        getManager().createNotificationChannel(channel);
    }

    public NotificationManager getManager() {
        if (mManager == null) {
            mManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        }

        return mManager;
    }

    public NotificationCompat.Builder getChannelNotification(String activity) {
        return new NotificationCompat.Builder(getApplicationContext(), channelID)
                .setContentTitle(activity)
                .setContentText("Come on")
                .setSmallIcon(R.drawable.ic_event);
    }
}

清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.app.notifications">

    <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="com.app.notifications.AlarmReceiver" />

        <service
            android:name="com.app.notifications.NotificationService"
            android:permission="android.permission.BIND_JOB_SERVICE" />

    </application>

</manifest>
android alarmmanager
1个回答
0
投票

JobScheduler在满足JobInfo中提到的所有条件时触发,并且系统还应该有足够的空闲空间来处理作业。看来您添加的内容需要收费,这是工作的一项参数。尝试删除它。同样,给定的网络类型条件是不计量的。请检查是否对您的情况有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.