我希望我的应用程序收到一条短信以启动 MainAcitivity。即使应用程序关闭

I want my app to receive an sms to start the MainAcitivity. Even when the app is closed

我开发了一个应用程序,它可以接收特定的短信,然后执行预定义的任务。此应用程序在 运行 时运行良好。但是当它关​​闭时,它不会执行预定义的任务。我相信我的应用程序在关闭时无法接收广播是有问题的。也许我没有在清单文件中正确注册接收器。 我有两个 classes。一个是扩展广播接收器的 SMSReceiver。第二个是 MainActivity 调用广播接收器接收文本消息并执行特定任务。

我的清单文件是:

<receiver android:name=".SMSReceiver" android:exported="true" 
android:enabled="true" android:directBootAware="true">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>

<activity

android:name=".MainActivity">

</activity>

SMSReceiver Class 代码:

public class SMSReceiver  extends BroadcastReceiver {
public String number;
public String nn;
public String v;

@Override
public void onReceive(Context context, Intent intent) {

}
}

MainActivityclass代码

public class MainActivity extends AppCompatActivity{
public String r_num;
Button btn;
EditText msg;
EditText num;
IntentFilter intentFilter;

private BroadcastReceiver intentReceiver = new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {

//MYCODE
}
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();
intentFilter.addAction("SMS_RECEIVED_ACTION");

btn = (Button) this.findViewById(R.id.sendbtn);
msg = (EditText) this.findViewById(R.id.message);
num = (EditText) this.findViewById(R.id.numbertxt);
btn.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {
}} });
}

private void sendMsg(String n, String m) {
}

protected  void onResume()
{
registerReceiver(intentReceiver,intentFilter);
super.onResume();
}
protected void onPause()
{
unregisterReceiver(intentReceiver);
super.onPause();
}}

当我的应用程序是 运行 时,这段代码工作正常。我希望我的应用程序即使在 closed/not 运行 时也能响应消息。提前致谢

从 MainActivity 中删除广播接收器。在 SMSReceiver 的 onReceive() 中开始 MainActivity 而不是发送广播。将额外数据放入 Intent 并在 MainActivity 的 onNewIntent().

中接收它
Intent intent = Intent(context, MainActivity.java)
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
context.startActivity(intent)

MainActivity 中覆盖 onNewIntent()。将MainActivity中广播接收者的代码放入onNewIntent()

或者将此代码放在 SMSReceiver 中而不是发送广播。

if(v.equalsIgnoreCase("call.me")) {
    Toast.makeText(context, "Generating Call, Please Wait", Toast.LENGTH_LONG).show();
    Intent callIntent = new Intent(Intent.ACTION_CALL);
    callIntent.setData(Uri.parse(number));
    context.startActivity(callIntent);

}

像这样从 SMSReceiver 向 Intent 添加额外内容

intent.putExtra("message", str);
intent.putExtra("me", v);
intent.putExtra("num", number);

像这样从onNewIntent()收到它

Bundle bundle = intent.getExtras();
String message = bundle.getString("message");
String me = bundle.getString("me");
String number = bundle.getString("num");