概述
(1)开启一个service,注册一个广播接收器,在onReceive中监听短信接受
(2)新建一个窗口,显示自定义布局
public class SmsService extends Service implements View.OnClickListener {
private SmsReceiver smsReceiver;
//发件人号码
private String smsPhone;
//短信内容
private String smsContent;
//窗口管理
private WindowManager wm;
//布局参数
private WindowManager.LayoutParams layoutparams;
//View
private DispatchLinearLayout mView;
private TextView tv_phone;
private TextView tv_content;
private Button btn_send_sms;
private HomeWatchReceiver mHomeWatchReceiver;
public static final String SYSTEM_DIALOGS_RESON_KEY = "reason";
public static final String SYSTEM_DIALOGS_HOME_KEY = "homekey";
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
init();
}
//初始化
private void init() {
L.i("init service");
//动态注册
smsReceiver = new SmsReceiver();
IntentFilter intent = new IntentFilter();
//添加Action
intent.addAction(StaticClass.SMS_ACTION);
//设置权限
intent.setPriority(Integer.MAX_VALUE);
//注册
registerReceiver(smsReceiver, intent);
mHomeWatchReceiver = new HomeWatchReceiver();
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
registerReceiver(mHomeWatchReceiver, intentFilter);
}
@Override
public void onDestroy() {
super.onDestroy();
L.i("stop service");
//注销
unregisterReceiver(smsReceiver);
unregisterReceiver(mHomeWatchReceiver);
}
//短信广播
public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (StaticClass.SMS_ACTION.equals(action)) {
//获取短信内容返回的是一个Object数组
Object[] objs = (Object[]) intent.getExtras().get("pdus");
//遍历数组得到相关数据
for (Object obj : objs) {
//把数组元素转换成短信对象
SmsMessage sms = SmsMessage.createFromPdu((byte[]) obj);
//发件人
smsPhone = sms.getOriginatingAddress();
//内容
smsContent = sms.getMessageBody();
L.i("短信的内容:" + smsPhone + ":" + smsContent);
showWindow();
}
}
}
}
//窗口提示
private void showWindow() {
//获取系统服务
wm = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
//获取布局参数
layoutparams = new WindowManager.LayoutParams();
//定义宽高
layoutparams.width = WindowManager.LayoutParams.MATCH_PARENT;
layoutparams.height = WindowManager.LayoutParams.MATCH_PARENT;
//定义标记
layoutparams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
//定义格式
layoutparams.format = PixelFormat.TRANSLUCENT;
//定义类型
layoutparams.type = WindowManager.LayoutParams.TYPE_PHONE;
//加载布局
mView = (DispatchLinearLayout) View.inflate(getApplicationContext(), R.layout.sms_item, null);
tv_phone = (TextView) mView.findViewById(R.id.tv_phone);
tv_content = (TextView) mView.findViewById(R.id.tv_content);
btn_send_sms = (Button) mView.findViewById(R.id.btn_send_sms);
btn_send_sms.setOnClickListener(this);
//设置数据
tv_phone.setText("发件人:" + smsPhone);
L.i("短信内容:" + smsContent);
tv_content.setText(smsContent);
//添加View到窗口
wm.addView(mView, layoutparams);
mView.setDispatchKeyEventListener(mDispatchKeyEventListener);
}
private DispatchLinearLayout.DispatchKeyEventListener mDispatchKeyEventListener
= new DispatchLinearLayout.DispatchKeyEventListener() {
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
//判断是否是按返回键
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
L.i("我按了BACK键");
if (mView.getParent() != null) {
wm.removeView(mView);
}
return true;
}
return false;
}
};
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_send_sms:
sendSms();
//消失窗口
if (mView.getParent() != null) {
wm.removeView(mView);
}
break;
}
}
//回复短信
private void sendSms() {
Uri uri = Uri.parse("smsto:" + smsPhone);
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
//设置启动模式
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("sms_body", "");
startActivity(intent);
}
//监听Home键的广播
class HomeWatchReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
String reason = intent.getStringExtra(SYSTEM_DIALOGS_RESON_KEY);
if (SYSTEM_DIALOGS_HOME_KEY.equals(reason)) {
if (mView.getParent() != null) {
wm.removeView(mView);
}
}
}
}
}
}
自定义布局
public class DispatchLinearLayout extends LinearLayout {
private DispatchKeyEventListener dispatchKeyEventListener;
public DispatchLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public DispatchLinearLayout(Context context) {
super(context);
}
public DispatchLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public DispatchKeyEventListener getDispatchKeyEventListener() {
return dispatchKeyEventListener;
}
public void setDispatchKeyEventListener(DispatchKeyEventListener dispatchKeyEventListener) {
this.dispatchKeyEventListener = dispatchKeyEventListener;
}
//接口
public static interface DispatchKeyEventListener {
boolean dispatchKeyEvent(KeyEvent event);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
//如果不为空 说明调用了 去获取事件
if (dispatchKeyEventListener != null) {
return dispatchKeyEventListener.dispatchKeyEvent(event);
}
return super.dispatchKeyEvent(event);
}
}
权限
<uses-permission android:name="android.permission.RECEIVE_SMS" />
最后
以上就是丰富鸡为你收集整理的Android自定义短信接受弹框提示的全部内容,希望文章能够帮你解决Android自定义短信接受弹框提示所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复