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