一、首先需要开启服务
startService(new Intent(MainActivity.this,MyService.class));
开启肯定也需要关闭服务
stopService(new Intent(MainActivity.this,MyService.class));
不要忘了在manifest中注册:
<service android:name="com.dongge.service.MyService"></service>
二、自定义server
oncreate中进行初始化
①首先创建一个接收短信的广播
class MyReceiver extends BroadcastReceiver implements OnClickListener { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals("android.provider.Telephony.SMS_RECEIVED")) { L.e("短信来了"); Object[] objects = (Object[]) intent.getExtras().get("pdus"); for (Object object : objects) { // 把数组元素转换成短信对象 SmsMessage sms = SmsMessage.createFromPdu((byte[]) object); Smsphone = sms.getOriginatingAddress(); SmsContent = sms.getMessageBody(); L.e("电话号码:" + Smsphone + "短信内容:" + SmsContent); showWindow(); } } }
初始化发送的广播并注册
receiver = new MyReceiver(); IntentFilter intent = new IntentFilter(); intent.addAction("android.provider.Telephony.SMS_RECEIVED"); intent.setPriority(Integer.MAX_VALUE); registerReceiver(receiver, intent);
②showWindow():用于显示短信的窗口的方法
首先我们对窗口WindiowManager进行初始化
// 获得系统服务 wm = (WindowManager) getApplicationContext().getSystemService( Context.WINDOW_SERVICE); // 获取布局参数u layoutParams = new 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_content.setText(SmsContent); tv_phone.setText(Smsphone); wm.addView(mView, layoutParams);
窗口布局非常简单
点击回复按钮进行发送短信:
Uri url = Uri.parse("smsto:" + Smsphone); Intent intent = new Intent(Intent.ACTION_SENDTO, url); // 设置启动模式 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 跳转到短信,携带的信息内容 intent.putExtra("sms_body", "你好,我是你的小东管家"); startActivity(intent);
跳转到发送短信的页面记得关闭窗口:
if (mView.getParent() != null) { wm.removeView(mView); }
但是现在也出现一个问题,当我们按下back和home键的时候窗口不显示,这时候我们就需要进行事件分发,将事件分发反馈给我们view
对我们布局最上面的Linear进行自定view,继承ListView
首先我们需要定义一个接口
// 1.定义一个接口 public static interface DispatchKeyEventListener { // 2.定义一个方法 boolean dispatchKeyEvent(KeyEvent event); }
然后定义接口
private DispatchKeyEventListener dispatchKeyEventListener;
获取事件
public boolean dispatchKeyEvent(KeyEvent event) { // 如果不为空 说明调用了 去获取事件 if (dispatchKeyEventListener != null) { return dispatchKeyEventListener.dispatchKeyEvent(event); } return super.dispatchKeyEvent(event); }
也不要忘了进行set,get方法
public DispatchKeyEventListener getDispatchKeyEventListener() { return dispatchKeyEventListener; } public void setDispatchKeyEventListener( DispatchKeyEventListener dispatchKeyEventListener) { this.dispatchKeyEventListener = dispatchKeyEventListener; }
在刚才显示窗口的方法中进行分发事件处理
// 设置分发事件 mView.setDispatchKeyEventListener(dispatchKeyEventListener);
DispatchKeyEventListener dispatchKeyEventListener = new DispatchKeyEventListener() { @Override public boolean dispatchKeyEvent(KeyEvent event) { // 判断是否是返回键 if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { if (mView.getParent() != null) { wm.removeView(mView); } return true; } return false; } };
对于home键,系统自带了一个广播
首先定义一个广播
// 监听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("reason"); if (reason.equals("homekey")) { if (mView.getParent() != null) { wm.removeView(mView); } } } } }
对广播进行初始化:
homeWatchReceiver = new HomeWatchReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); registerReceiver(homeWatchReceiver, filter);
此时就完成短信的接收,发送,并以自定义窗口的样式显示
