需求:当来新短信时,即便在桌面或其他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);
}
}