在 Kitkat 上没有 LAUNCHER 时的 BroadcastReceiver

BroadcastReceiver when no LAUNCHER is present, on Kitkat

我有一个项目,我必须在其中创建一个具有以下属性的应用程序:

到目前为止,我的问题是,在 Kitkat 上,我的 BoradcastReceiver 在刚安装应用程序时不工作,但是,如果应用程序 运行 一次,那么它会正确执行。在以前的版本中,它的行为是正确的。 我读到 [HoneyComb 3.1] 版本的广播系统发生了变化,this question for instance,表明我的问题已经知道。

我的问题是:有没有办法安装一个应用程序,并在需要时保持安静。例如他们在 [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);
    }
}

}

Is there a way to install an APP, and keep it silent, until needed

不是真的。在任何清单注册的接收器工作之前,必须使用显式 Intent 来启动您的应用程序组件之一。如果您没有主屏幕启动器,我不知道还有什么可以使用显式 Intent.

启动您的应用程序组件之一

would starting the app once during boot, then closing it would be a reasonable approach?

不,因为您无法在启动时获得控制权,除非通过清单注册 BroadcastReceiver,这使您处于与现在相同的位置。

My system needs the user to actively install the APP

那么拥有一个启动器应该没有什么特别的问题activity,至少对于一次性启动来说是这样。欢迎您随后禁用 activity,但如果用户强行停止您的应用程序,您将再次处于停止状态并且不再响应广播。

and the APP has the purpose of triggering additional sounds/movement when a message is given, to indicate that the user is in physical danger

那么不用管启动器activity应该没有问题。毕竟,用户需要能够配置您的应用程序的行为。