使用 Android JobScheduler 安排需要网络访问的任务

Scheduling of tasks with the Android JobScheduler that require network access

在我的 android 应用程序中,我想在网络连接时每天更新外币汇率 there.I 只想每天更新一次货币汇率并在下一个 days.Recently 我听说 android 工作 scheduler.Is 对我的问题有用吗?如果是这样,我如何使用它来更新每天的汇率?请帮助 me.Also 在棒棒糖以下的 android 版本中做什么?

此方法每天在 15:30 启动 alaram manger。在您的 mainActivity 中添加:

private void setNotifyAlarm() {
        long _alarm;
        AlarmManager al;
        PendingIntent fintent;
        Intent notif;

        Calendar now = Calendar.getInstance();
        Calendar wakeupcall = Calendar.getInstance();
        wakeupcall.setTimeInMillis(System.currentTimeMillis());
        wakeupcall.set(Calendar.HOUR_OF_DAY, 15);
        wakeupcall.set(Calendar.MINUTE, 30);

        if (wakeupcall.getTimeInMillis() <= now.getTimeInMillis())
            _alarm=wakeupcall.getTimeInMillis() + (AlarmManager.INTERVAL_DAY+1);
        else
            _alarm=wakeupcall.getTimeInMillis();


        al = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        notif= new Intent(this,TestNotifyService.class);
        fintent = PendingIntent.getService(this,0,notif,0);

        if (SDK_INT < Build.VERSION_CODES.KITKAT) {
            al.set(AlarmManager.RTC_WAKEUP,_alarm, fintent);
            Log.d("lowerMN","hahah");
        }
        else if (Build.VERSION_CODES.KITKAT <= SDK_INT  && SDK_INT < Build.VERSION_CODES.M) {
            al.setExact(AlarmManager.RTC_WAKEUP,_alarm,fintent);
            Log.d("kitkatMN","hahah");
        }
        else if (SDK_INT >= Build.VERSION_CODES.M) {
            al.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,_alarm,fintent);
            Log.d("marshmallowMN","hahah");
        }

    }

现在,在 TestNotifyService.java class 实际做你的工作,

public class TestNotifyService extends IntentService {

    PowerManager powerManager;
    PowerManager.WakeLock wakeLock=null;
    private AlarmManager al;
    PendingIntent fintent;
    Intent notif;
    final int SDK_INT = Build.VERSION.SDK_INT;
    long _alarm;

    public TestNotifyService() {
        super("");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        powerManager = (PowerManager) getSystemService(POWER_SERVICE);
        wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "TRYNOTIFY");
        wakeLock.acquire();
        fetchingDATA();
    }

    private void fetchingDATA() {
        try {

            ........CALL WEBSERVICE TO GET LATEST DATA.......

        } catch (Exception e) {
        }
        reSETNOTIFY();
        wakeLock.release();
    }

    private void reSETNOTIFY() {

        Calendar now = Calendar.getInstance();
        Calendar wakeupcall = Calendar.getInstance();
        wakeupcall.setTimeInMillis(System.currentTimeMillis());
        wakeupcall.set(Calendar.HOUR_OF_DAY, 15);
        wakeupcall.set(Calendar.MINUTE, 30);

        if (wakeupcall.getTimeInMillis() <= now.getTimeInMillis())
            _alarm=wakeupcall.getTimeInMillis() + (AlarmManager.INTERVAL_DAY+1)+25000;
        else
            _alarm=wakeupcall.getTimeInMillis()+25000;

        al = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        notif= new Intent(this,TestNotifyService.class);
        fintent = PendingIntent.getService(this,0,notif,0);

        if (SDK_INT < Build.VERSION_CODES.KITKAT) {
            al.set(AlarmManager.RTC_WAKEUP,_alarm, fintent);
            Log.d("lowerNS","hahah");
        }
        else if (Build.VERSION_CODES.KITKAT <= SDK_INT  && SDK_INT < Build.VERSION_CODES.M) {
            al.setExact(AlarmManager.RTC_WAKEUP,_alarm,fintent);
            Log.d("kitkatNS","hahah");
        }
        else if (SDK_INT >= Build.VERSION_CODES.M) {
            al.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,_alarm,fintent);
            Log.d("marshmallowNS","hahah");
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

现在,当设备重新启动时,您需要使用 Brodcast Receiver 重置警报:

public class Nauto extends BroadcastReceiver {
    final int SDK_INT = Build.VERSION.SDK_INT;

    public Nauto() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        long _Nalarm;
        Log.d("Bootcompleted","starting");
        if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")){

            AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
            Intent intent1 = new Intent(context, TestNotifyService.class);
            PendingIntent alarmIntent = PendingIntent.getService(context, 0, intent1, 0);

            Calendar now = Calendar.getInstance();
            Calendar wakeupcall = Calendar.getInstance();
            wakeupcall.setTimeInMillis(System.currentTimeMillis());
            wakeupcall.set(Calendar.HOUR_OF_DAY, 15);
            wakeupcall.set(Calendar.MINUTE, 30);

            if (wakeupcall.getTimeInMillis() <= now.getTimeInMillis())
                _Nalarm=wakeupcall.getTimeInMillis() + (AlarmManager.INTERVAL_DAY+1);
            else
                _Nalarm=wakeupcall.getTimeInMillis();

            if (SDK_INT < Build.VERSION_CODES.KITKAT) {
                alarmMgr.set(AlarmManager.RTC_WAKEUP,_Nalarm, alarmIntent);
                Log.d("lowerNB","hahah");
            }
            else if (Build.VERSION_CODES.KITKAT <= SDK_INT  && SDK_INT < Build.VERSION_CODES.M) {
                alarmMgr.setExact(AlarmManager.RTC_WAKEUP,_Nalarm,alarmIntent);
                Log.d("kitkatNB","hahah");
            }
            else if (SDK_INT >= Build.VERSION_CODES.M) {
                alarmMgr.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,_Nalarm,alarmIntent);
                Log.d("marshmallowNB","hahah");
            }

        }

    }
}

最后,在 Manifest 文件中添加:

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

<service android:name=".TestNotifyService" android:exported="true" android:enabled="true"/>

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

让我知道它是否有效。