我已经开发了一个接收特定文本消息然后执行预定义任务的应用程序。该应用运行时运行良好。但关闭时不会执行预定义的任务。我认为有一个问题,我的应用程序关闭后无法接收广播。也许我没有在清单文件中正确注册接收者。 我有两节课。一种是 SMSReceiver ,它扩展了broadCast接收器。第二个是 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类代码:
public class SMSReceiver extends BroadcastReceiver {
public String number;
public String nn;
public String v;
@Override
public void onReceive(Context context, Intent intent) {
}
}
MainActivity类代码
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();
}}
当我的应用程序运行时,此代码可以正常工作。我希望我的应用即使在关闭/未运行的情况下也能响应消息。预先感谢
答案 0 :(得分:0)
从MainActivity删除广播接收器。在SMSReceiver的onReceive()
中,开始MainActivity
而不是发送广播。将额外的数据放入意图中并在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.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");