项目地址 https://github.com/OOCZC/Android_SpamMess
需求:当来新短信时,即便在桌面或其他App界面时,也能弹出对话框。
思路:App接收短信广播,然后在BroadcastReceiver的onReceive中用intent打开主题为对话框的Activity。
先实现接收短信广播:
在AndroidManifest.xml中添加权限,注册广播,注册新Activity为对话框主题。
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
<activity
android:name=".Dialog_Activity"
android:theme="@style/Theme.AppCompat.Dialog"/>
在广播的onReceive中启动Dialog_Activity
MyReceiver.java (extend BroadcastReceiver)
Intent intent1 =
new Intent();
intent1.setClass(context,Dialog_Activity.class);
intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent1.putExtra(
"number",
"" + msg.getOriginatingAddress());
intent1.putExtra(
"body",
"" + msg.getDisplayMessageBody());
this.abortBroadcast();
context.startActivity(intent1);
附:接收新短信,用于启动Activity的广播MyReceiver
public class MyReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
SmsMessage msg =
null;
if (
null != bundle) {
Object[] smsObj = (Object[]) bundle.get(
"pdus");
for (Object object : smsObj) {
msg = SmsMessage.createFromPdu((
byte[]) object);
Date date =
new Date(msg.getTimestampMillis());
SimpleDateFormat format =
new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
String receiveTime = format.format(date);
System.out.println(
"number:" + msg.getOriginatingAddress()
+
" body:" + msg.getDisplayMessageBody() +
" time:"
+ msg.getTimestampMillis());
}
}
Intent intent1 =
new Intent();
intent1.setClass(context,Dialog_Activity.class);
intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent1.putExtra(
"number",
"" + msg.getOriginatingAddress());
intent1.putExtra(
"body",
"" + msg.getDisplayMessageBody());
this.abortBroadcast();
context.startActivity(intent1);
}
}