1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Service rodando em segundo plano sem ser morto pelo android

Aí galera, alguém de vocês será que saberia me dizer como eu faço para rodar um serviço por um longo período de tempo(mais precisamente das 08:00 às 22:00) sem que ele seja morto pelo android? Após algum tempo também, o Android põe o meu serviço em segundo plano. Com isso eu não consigo executar minha rotina.

Eu queria tentar resolver isso sem usar o método startForeground() (pelo fato de não poder remover notificação de processos em primeiro plano). Agradeço a quem puder dar uma ajuda ;)

Segue o código da minha Activity e Service

Classe Service

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        final String msgOriginal = MSG_PADRAO;
        final String phone = intent.getStringExtra(PARAM_PHONE);
        String horaAtualString = DateStringUtil.getHorasString(System
                .currentTimeMillis());
        final int[] hora = DateStringUtil.getTimeFromString(horaAtualString);
        if (hora[0] >= 8 && hora[0] < 22) {
            notification = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            showNotification();
            new Thread() {
                @SuppressWarnings("static-access")
                @Override
                public void run() {
                    while (hora[0] <= 21) {
                        boolean isFirstMessage = true;
                        String msgVariavel = "";
                        msgVariavel = msgOriginal;
                        if (isFirstMessage && hora[0] <= 9) {
                            msgVariavel = BOM_DIA.concat(msgVariavel);
                            isFirstMessage = false;
                        }
                        if (hora[0] == 10) {
                            msgVariavel = PAUSA_LANCHE_MANHA;
                        } else if (hora[0] == 12) {
                            msgVariavel = PAUSA_ALMOCO;
                        } else if (hora[0] == 16) {
                            msgVariavel = PAUSA_LANCHE_TARDE;
                        } else if (hora[0] == 19) {
                            msgVariavel = PAUSA_JANTA;
                        }
                        enviaSMS(phone, msgVariavel, hora[0]);
                        hora[0]++;
                        if (hora[0] != 21) {
                            try {
                                this.sleep(TIME_MILLIS);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }.start();
            if(hora[0] == 21 & hora[1] == hora[1]){
                retornaActivityInicio(MSG_FIM_SUCESSO);
            }
        } else {
            retornaActivityInicio("Cuidado!Agora não é uma boa hora para enviar SMS para as pessoas!");
        }

        return START_REDELIVER_INTENT;
    }

Classe Activity

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_dropdown_item_1line,
                contactsAutoComplete());
        autocomplete = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView);
        autocomplete.setAdapter(adapter);

        IntentFilter filter = new IntentFilter(ResponseReceiver.ACTION_RESP);
        filter.addCategory(Intent.CATEGORY_DEFAULT);
        receiver = new ResponseReceiver();
        registerReceiver(receiver, filter);
    }

public class ResponseReceiver extends BroadcastReceiver {
        public static final String ACTION_RESP = "br.foton.intent.action.MESSAGE_PROCESSED";

        @Override
        public void onReceive(Context context, Intent intent) {
            String result = intent
                    .getStringExtra(SimpleIntentService.PARAM_OUT_MSG);
            TextView text_result = (TextView) findViewById(R.id.tv_result);
            text_result.setText(result);
            text_result.setVisibility(1);
        }
    }

@SuppressLint("NewApi")
    public void iniciaServico(View target) {
        if (autocomplete.getText().toString().trim().isEmpty()) {
            Toast.makeText(this, "Informe um número para prosseguir!",
                    Toast.LENGTH_SHORT).show();
        } else if (!Validadores.validaTelefone(autocomplete.getText()
                .toString())) {
            Toast.makeText(this, "Informe um número válido!",
                    Toast.LENGTH_SHORT).show();
        } else {
            EditText msg = (EditText) findViewById(R.id.input_msg_lembrete);
            Intent intent = new Intent(this, SimpleIntentService.class);
            intent.putExtra(SimpleIntentService.PARAM_PHONE, autocomplete
                    .getText().toString());
            intent.putExtra(SimpleIntentService.PARAM_MSG_LEMBRETE, msg
                    .getText().toString());
            startService(intent);
        }
    }
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags android threads ou faça a sua própria pergunta.