server——短信提醒

news/2024/7/5 18:28:33

一、首先需要开启服务

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

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


http://www.niftyadmin.cn/n/3649377.html

相关文章

[C#]I/O完成端口的类定义和测试实例

从William Kennedy那里整理过来的,不同之处在于他自己定义了一个Overlapped&#xff0c;而我们这里直接使用 System.Threading.NativeOverlapped.附一段我以前的Win32下的IOCP文档&#xff0c;如果您了解IOCP也可以直接跳过看后面的C#测试示范&#xff1a;整理者&#xff1a;郑…

关于“微笑涛声”博客

博客简介“微笑涛声”是一个分享学习心得、记录自己生活点滴、探索互联网技术的博客。随着互联网技术的飞速发展&#xff0c;在互联网上留下属于自己的足迹已不再是难事。能在互联网上拥有一个真正属于自己的空间&#xff0c;是我的梦想&#xff0c;而今天这个梦想在“博客”中…

检测Android应用(APP)的启动与关闭

问题 当开发安卓程序的时候&#xff0c;我们不免需要去检测应用什么时候在前台运行&#xff0c;用户什么时候离开。不幸的是&#xff0c;没有一个简单的方法可以做到这点。当用户第一次启动的时候去检测还是不难&#xff0c;但如果是重新打开或关闭就不简单了。 这篇文章将会展…

vue项目构建和部署_如何使用Vue设置,构建和部署本机应用程序

vue项目构建和部署Vue Native is a Javascript framework that is designed to deliver cross platform mobile native applications. It is inspired by the React Native project. Vue Native是一个Javascript框架&#xff0c;旨在提供跨平台的移动本机应用程序。 它受React …

智能管家(一)

#第一章&#xff1a;项目的准备##一、项目的第一步导入包compile com.android.support:design:24.2.1软件包分类:com.yijia.com.smartbutler.adaptercom.yijia.com.smartbutler.applicationcom.yijia.com.smartbutler.entitycom.yijia.com.smartbutler.fragmentcom.yijia.com.s…

V1.0博客搭建与开发的31天

博客搭建与开发时间线2020年01月02日&#xff1a; 微笑涛声博客1.0版本正式开始搭建&#xff0c;博客采用WordPressMySQLPHPNGINX搭建基本框架。主题为WordPress默认。一天内完成基本框架搭建。 2020年01月03日&#xff1a; 从华为云购买域名cztcms.cn(云服务器已有)。同时域名…

智能管家(二)——工具类封装与首页引导页开发

#智能管家 ##第二章&#xff1a;工具类封装与首页引导页开发##一、log类的封装public class L {//开关public static final boolean DEBUG true;//TAGpublic static final String TAG "SmartButler";//五个等级 DIWEpublic static void d(String text){if(DEBUG)…

Angular+SpringBoot前后端分离项目上传云服务器

一、前端&#xff08;客户端&#xff09;上传服务器 1、安装nginx&#xff0c;开启服务&#xff0c;查看状态 安装&#xff1a;yum install nginx开启服务&#xff1a;service nginx start 重启服务&#xff1a;service nginx restart2、打包Angular项目–控制台输入 打包命…