一、首先需要开启服务
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);
此时就完成短信的接收,发送,并以自定义窗口的样式显示