android - 如何定期制作和运行服务?
问题描述
我正在开发一个具有后台服务的 android 应用程序 (java)。
该服务的功能是将android设备的电池电量发送到webService。
一切都已经按如下方式工作:
主要活动
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initService();
}
public void initService() {
intentService = new Intent(getBaseContext(), service.verifybattery.class);
try {
startService(intentService);
} catch (Exception e) {
String teste = e.toString();
}
}
类服务
public class verifybattery extends Service{
private boolean ativo;
private int cont;
@Override
public void onCreate() {
cont = 0;
}
public String getIP(){
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ip = wifiInfo.getIpAddress();
String strIP = String.format("%d.%d.%d.%d",
(ip & 0xff),
(ip >> 8 & 0xff),
(ip >> 16 & 0xff),
(ip >> 24 & 0xff));
return strIP;
}
private void processa() {
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = this.registerReceiver(null, ifilter);
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
Double batteryPct = level / (double)scale;
SimpleDateFormat formataDataHora = new SimpleDateFormat("HH:mm - dd/MM");
Date dataHora = new Date();
String dataFormatada = formataDataHora.format(dataHora);
String nome;
//String modelo = Build.MODEL.substring(0,19);
String modelo = Build.MODEL;
String serial = Build.SERIAL;
String ip = getIP();
if(PrincipalActivity.mesa != null){
nome = PrincipalActivity.mesa.getNomeAmigavel();
}
else{
nome = "?";
}
JSONObject obj = new JSONObject();
try {
obj.put("id", 0);
obj.put("nome", nome);
obj.put("modelo", modelo);
obj.put("serialNumber",serial);
obj.put("ip", ip);
obj.put("bateria",batteryPct);
obj.put("atual", dataFormatada);
} catch (JSONException e) {
e.printStackTrace();
}
String response = "";
try {
response = new PutJson("Enviar nivel da Bateria", this,obj).execute(cardapioDigital.enviarBateria(PrincipalActivity.ServerCardapio, serial)).get();
if(!response.equals("")){
PrincipalActivity.ServerCardapio.setConectado(true);
}
else{
PrincipalActivity.ServerCardapio.setConectado(false);
}
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
//Toast.makeText(this, String.valueOf(batteryPct), Toast.LENGTH_SHORT).show();
}
public int onStartCommand(Intent intent, int flags, int startId) {
processa();
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
问题是 mainActivity 的 onCreate 在应用程序的生命周期中只运行一次。我想每 5 分钟运行一次服务(示例)。我该怎么做?
解决方案
我会使用这样的警报:
Intent intent = new Intent(MainActivity.this, VerifyBattery.class);
PendingIntent pintent = PendingIntent.getService(MainActivity.this, 0, intent, 0);
AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 300*1000, pintent);
这样,即使应用程序在后台,您的服务也应该被触发。
PS:如果你想遵循标准样式,你应该使用驼峰命名你的类( verifybattery -> VerifyBattery )
推荐阅读
- google-bigquery - BigQuery 中的递归/分层查询
- javascript - 正确路由路径的语法
- javascript - 如何将带有对象的字典转换为 geoJson?
- typescript - 如何在 Typescript 中从日期中减去 n 天
- bash - 错误:命令“bash”失败且没有错误消息?
- azure - 使用服务总线队列设计逻辑应用程序,以便在从服务器对文件进行 AV 扫描后通知恶意内容
- reactjs - 在 useEffect 中可以有条件地进行不同的清理吗?
- r - R dplyr/tidyr 重复行
- node.js - 我似乎无法让 npm 模块“大写”正常工作
- python - Python:正则表达式或字典