Java 在服务中每小时运行一次任务

Java 在服务中每小时运行一次任务,java,android,service,alarmmanager,google-geolocation,Java,Android,Service,Alarmmanager,Google Geolocation,我想每小时跟踪用户的塔位置。因此,我现在使用一个报警管理器。使用报警管理器,有时会触发报警,有时不会 xiomi设备中也存在问题,如果应用程序从ram中关闭,则不会触发警报 还有别的办法吗?我可以连续运行服务并每小时跟踪位置吗 我想要一个解决方案,在一个服务中,我应该能够每小时运行这个任务,可以使用处理程序或计时器 如何使用作业计划程序进行此操作 现在,我尝试使用alarm manager: public static boolean setAlarm(Context context)

我想每小时跟踪用户的塔位置。因此,我现在使用一个报警管理器。使用报警管理器,有时会触发报警,有时不会

xiomi设备中也存在问题,如果应用程序从ram中关闭,则不会触发警报

还有别的办法吗?我可以连续运行服务并每小时跟踪位置吗

我想要一个解决方案,在一个服务中,我应该能够每小时运行这个任务,可以使用处理程序或计时器

如何使用作业计划程序进行此操作

现在,我尝试使用alarm manager:

    public static boolean setAlarm(Context context) {

    Calendar calendarNow = Calendar.getInstance();

    Intent intent = new Intent(context,  SaveLocationReceiver.class);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 1321, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendarNow.getTimeInMillis(), AlarmManager.INTERVAL_FIFTEEN_MINUTES, pendingIntent);

    ComponentName receiver = new ComponentName(context,  SaveLocationReceiver.class);
    PackageManager pm = context.getPackageManager();

    pm.setComponentEnabledSetting(receiver,
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP);

    return true;
}
SaveLocationReceiver.java

public class SaveLocationReceiver extends BroadcastReceiver {

    private SharedPreferences preferences;
    String networkSubType="";

    SessionData mSessionData;

    @Override
    public void onReceive(final Context context, Intent intent) {
        Log.d("myapp", "service started");

        mSessionData = new SessionData(context);

        if(ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                && ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED)
        {

            Calendar calendarSet = Calendar.getInstance();
            Calendar calendarNow = Calendar.getInstance();

            calendarSet.set(Calendar.HOUR_OF_DAY, 7); // hour
            calendarSet.set(Calendar.MINUTE, 00); // minute
            calendarSet.set(Calendar.SECOND, 0); // second

            Calendar calendarEnd = Calendar.getInstance();

            calendarEnd.set(Calendar.HOUR_OF_DAY, 20); // hour
            calendarEnd.set(Calendar.MINUTE, 00); // minute
            calendarEnd.set(Calendar.SECOND, 0); // second


            SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            System.out.println(calendarNow.getTime());
// Output "Wed Sep 26 14:23:28 EST 2012"

            String currentTime = format1.format(calendarNow.getTime());
            System.out.println(currentTime);

            if (calendarNow.compareTo(calendarSet) >= 0 && calendarNow.compareTo(calendarEnd) <= 0) {

        TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
        GsmCellLocation cellLocation = (GsmCellLocation) telephonyManager.getCellLocation();

        ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);//?????????
        NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();

        if (cellLocation != null) {

            int cellid = cellLocation.getCid();
            int celllac = cellLocation.getLac();

            if(activeNetInfo != null) {
               networkSubType = activeNetInfo.getSubtypeName();
            }

            String networkOperator = telephonyManager.getNetworkOperator();

            int mcc = Integer.parseInt(networkOperator.substring(0, 3));
            int mnc = Integer.parseInt(networkOperator.substring(3));

            String networkOperatorName = telephonyManager.getNetworkOperatorName();
            int type = telephonyManager.getNetworkType();


            Log.d("CellLocation", cellLocation.toString());
            Log.d("GSM CELL ID", String.valueOf(cellid));
            Log.d("GSM Location Code", String.valueOf(celllac));


            Log.d("MCC", String.valueOf(mcc));
            Log.d("MNC", String.valueOf(mnc));
            Log.d("NetworkOperatorName", networkOperatorName);
            Log.d("radioType", String.valueOf(type));
            Log.d("Network subtype name", networkSubType);


            AddLocationAsyncTask addLocationAsyncTask = new AddLocationAsyncTask(context);
            addLocationAsyncTask.execute(mSessionData.getString("user_id",""), String.valueOf(cellid), String.valueOf(celllac), String.valueOf(mcc), String.valueOf(mnc),
                    networkOperatorName, networkSubType, currentTime);

        }

        }

        }
    }
}
公共类SaveLocationReceiver扩展了BroadcastReceiver{
私人共享参考偏好;
字符串networkSubType=“”;
会话数据;
@凌驾
公共void onReceive(最终上下文、意图){
Log.d(“myapp”,“服务已启动”);
mSessionData=新会话数据(上下文);
if(ContextCompat.checkSelfPermission(context,Manifest.permission.ACCESS\u FINE\u LOCATION)==PackageManager.permission\u已授予
&&ContextCompat.checkSelfPermission(上下文、清单、权限、访问\u位置)==PackageManager.permission\u已授予)
{
Calendar calendarSet=Calendar.getInstance();
Calendar calendarNow=Calendar.getInstance();
calendarSet.set(Calendar.HOUR,7);//小时
calendarSet.set(Calendar.MINUTE,00);//分钟
calendarSet.set(Calendar.SECOND,0);//秒
Calendar calendarEnd=Calendar.getInstance();
calendarEnd.set(Calendar.HOUR,20);//小时
calendarEnd.set(Calendar.MINUTE,00);//分钟
calendarEnd.set(Calendar.SECOND,0);//秒
SimpleDataFormat 1=新的SimpleDataFormat(“yyyy-MM-dd HH:MM:ss”);
System.out.println(calendarNow.getTime());
//输出“Wed Sep 26 14:23:28 EST 2012”
字符串currentTime=format1.format(calendarNow.getTime());
系统输出打印项次(当前时间);

如果(calendarNow.compareTo(calendarSet)>=0&&calendarNow.compareTo(calendarEnd)请尝试将您的服务设置为前台服务…它被系统杀死的可能性降低我现在没有使用服务,我使用的是广播接收器。我想知道如何在服务中执行此操作?@raxerzstart service,同时接收广播消息。我有时会错过广播接收器,即报警,因此如何启动服务e仅在接收器中?我想要一个解决方案,在服务中,我应该能够每小时运行此任务,可能使用处理程序或计时器???@kdblue您试图实现的功能被操作系统阻止,一些供应商会更积极地阻止。因此,执行此任务的唯一方法是在21+设备上使用JobScheduler或在上使用alarmManager