BroadcastReceiver, когда нет LAUNCHER, на Kitkat

У меня есть проект, в котором я должен создать приложение со следующими свойствами:

  • Нет LAUNCHER: category android:name="android.intent.category.LAUNCHER"
  • Он должен читать SMS, отправленные с определенного номера, и когда это происходит, запускать действие.
  • Работа на большинстве версий Android (моя цель сейчас — от [Froyo, 2.2] до [Kitkat, 4.4])

Пока что моя проблема заключается в том, что на Kitkat мой BoradcastReceiver не работает, когда приложение только что установлено, однако, если приложение запускается один раз, оно работает правильно. На предыдущих версиях ведет себя корректно. Я читал, что в версии [HoneyComb 3.1] произошли изменения в системе вещания, этот вопрос например, показывает, что моя проблема известна.

Мой вопрос: есть ли способ установить приложение и держать его в молчании до тех пор, пока оно не понадобится. Например, как они работают с версиями ниже [Honeycomb]?

  • Если да, то может кто подскажет направление.
  • если нет, будет ли разумным запуск приложения один раз во время загрузки, а затем его закрытие?
  • В любом случае: то, что я строю, «чувствует» неправильно, поскольку то, что я делаю, считается плохой практикой? Моя система нуждается в том, чтобы пользователь активно устанавливал приложение, а цель приложения — вызывать дополнительные звуки/движения при получении сообщения, чтобы указать, что пользователь находится в физической опасности. Система используется для индикации того, что пользователь, его дом или какое-либо его/ее имущество находятся в непосредственной опасности, поэтому она должна проснуться и уведомить его/ее в большинстве случаев.

МАНИФЕСТ:

<?xml version="1.0" encoding="utf-8"?>

<!--<uses-sdk android:minSdkVersion="8" /> -->

<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application
    android:allowBackup="true"
    android:icon="@drawable/ic_iconedesktop"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <receiver android:name=".SMSbroadcastReceptor">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>

</application>

ПОЛУЧАТЕЛЬ

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.Toast;

public class SMSbroadcastReceptor extends BroadcastReceiver {
final SmsManager sms = SmsManager.getDefault();
public void onReceive(Context contexto, Intent intencao) {
    final Bundle bundle = intencao.getExtras();
    try {
        if (bundle != null) {
            final Object[] pdusObj = (Object[]) bundle.get("pdus");
            String quem = "";
            String mensagem = "";
            for (int i = 0; i < pdusObj.length; i++) {
                SmsMessage smsRecebido = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
                quem = smsRecebido.getDisplayOriginatingAddress();
                mensagem = smsRecebido.getDisplayMessageBody();
                Log.i("SMSbroadcastReceptor", "Quem: " + quem + "\n, O que: " + mensagem);
                Toast toast = Toast.makeText(contexto, "Quem: " + quem + "\n, O que: " + mensagem, Toast.LENGTH_LONG);
                toast.show();
            }
            if (quem.equals("+MY HIDDEN NUMBER IS HERE")) {// 
                // abortBroadcast();
                Intent comecarAMain = new Intent(contexto, MainActivity.class);
                comecarAMain.putExtra("MY PACKAGE", "A COMMAND");
                comecarAMain.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                contexto.startActivity(comecarAMain);
            }
        }
    } catch (Exception e) {
        Log.e("SMSbroadcastReceptor", "Excecao SMSbroadcastReceptor" + e);
    }
}

}


person Bonatti    schedule 02.07.2015    source источник


Ответы (1)


Есть ли способ установить приложение и хранить молчание до тех пор, пока оно не понадобится?

Не совсем. Что-то должно использовать явный Intent для запуска одного из компонентов вашего приложения, прежде чем заработают какие-либо зарегистрированные в манифесте приемники. Если у вас не будет панели запуска домашнего экрана, я не знаю, что еще может запустить один из компонентов вашего приложения, используя явный Intent.

было бы разумно запустить приложение один раз во время загрузки, а затем закрыть его?

Нет, потому что у вас нет другого способа получить управление во время загрузки, кроме как через BroadcastReceiver, зарегистрированный в манифесте, что ставит вас в то же положение, что и сейчас.

Моя система нуждается в том, чтобы пользователь активно устанавливал приложение

Тогда не должно быть особых проблем с активностью лаунчера, хотя бы для разового запуска. Затем вы можете отключить эту активность, хотя, если пользователь принудительно остановит ваше приложение, вы снова окажетесь в остановленном состоянии и больше не будете отвечать на трансляции.

и приложение предназначено для запуска дополнительных звуков / движений при получении сообщения, чтобы указать, что пользователь находится в физической опасности.

Тогда не должно быть проблем с тем, чтобы просто оставить пусковую установку в покое. В конце концов, пользователь должен иметь возможность настроить поведение вашего приложения.

person CommonsWare    schedule 02.07.2015