server——短信提醒

xiaoxiao2021-02-28  111

一、首先需要开启服务

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);

此时就完成短信的接收,发送,并以自定义窗口的样式显示

转载请注明原文地址: https://www.6miu.com/read-71796.html

最新回复(0)