在 Kitkat 上没有 LAUNCHER 时的 BroadcastReceiver
BroadcastReceiver when no LAUNCHER is present, on Kitkat
我有一个项目,我必须在其中创建一个具有以下属性的应用程序:
- 无发射器:类别android:name="android.intent.category.LAUNCHER"
- 它必须读取从特定号码发送的短信,当它读取时,启动 Activity
- 在大多数 Android 版本上工作(我现在的目标是从 [Froyo, 2.2] 到 [Kitkat, 4.4])
到目前为止,我的问题是,在 Kitkat 上,我的 BoradcastReceiver 在刚安装应用程序时不工作,但是,如果应用程序 运行 一次,那么它会正确执行。在以前的版本中,它的行为是正确的。
我读到 [HoneyComb 3.1] 版本的广播系统发生了变化,this question for instance,表明我的问题已经知道。
我的问题是:有没有办法安装一个应用程序,并在需要时保持安静。例如他们在 [Honeycomb]?
以下版本的工作方式
- 如果有,谁能指点方向
- 如果不是,是否会在启动期间启动一次应用程序,然后关闭它是否是一种合理的方法?
- 无论如何:我正在构建的东西 "feels" 是错误的,因为我正在做的事情被认为是不好的做法?我的系统需要用户主动安装APP,而APP的目的是在给定消息时触发额外的sounds/movement,以表明用户处于人身危险中。
该系统用于指示用户、他的家或his/hers属性的某些地方处于直接危险中,因此在大多数情况下它必须唤醒并通知him/her。
清单:
<?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应该没有问题。毕竟,用户需要能够配置您的应用程序的行为。
我有一个项目,我必须在其中创建一个具有以下属性的应用程序:
- 无发射器:类别android:name="android.intent.category.LAUNCHER"
- 它必须读取从特定号码发送的短信,当它读取时,启动 Activity
- 在大多数 Android 版本上工作(我现在的目标是从 [Froyo, 2.2] 到 [Kitkat, 4.4])
到目前为止,我的问题是,在 Kitkat 上,我的 BoradcastReceiver 在刚安装应用程序时不工作,但是,如果应用程序 运行 一次,那么它会正确执行。在以前的版本中,它的行为是正确的。 我读到 [HoneyComb 3.1] 版本的广播系统发生了变化,this question for instance,表明我的问题已经知道。
我的问题是:有没有办法安装一个应用程序,并在需要时保持安静。例如他们在 [Honeycomb]?
以下版本的工作方式- 如果有,谁能指点方向
- 如果不是,是否会在启动期间启动一次应用程序,然后关闭它是否是一种合理的方法?
- 无论如何:我正在构建的东西 "feels" 是错误的,因为我正在做的事情被认为是不好的做法?我的系统需要用户主动安装APP,而APP的目的是在给定消息时触发额外的sounds/movement,以表明用户处于人身危险中。 该系统用于指示用户、他的家或his/hers属性的某些地方处于直接危险中,因此在大多数情况下它必须唤醒并通知him/her。
清单:
<?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应该没有问题。毕竟,用户需要能够配置您的应用程序的行为。