首页 > 解决方案 > 如何定期制作和运行服务?

问题描述

我正在开发一个具有后台服务的 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 分钟运行一次服务(示例)。我该怎么做?

标签: android

解决方案


我会使用这样的警报

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 )


推荐阅读