Android创建服务和发送邮件

前言:

最近需要写个app方便工作,第一次写app,这里做个记录,方便以后代码的粘贴复制。

首先编写activity_main.xml,其中添加了四个按钮,对应四个功能,分别为添加服务,关闭服务,发送邮件和提权:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><Buttonandroid:id="@+id/btn_start"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="调用startService()方法开启服务"/><Buttonandroid:id="@+id/btn_stop"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="关闭服务"/><Buttonandroid:id="@+id/btn_emain"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="测试邮件"/><Buttonandroid:id="@+id/btn_quanxian"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="提升权限"/></LinearLayout>

主界面MainActivity:

import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.widget.Button;import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.security.Provider;import javax.mail.MessagingException;public class MainActivity extends AppCompatActivity {public static Context mContext;@SuppressLint("ResourceType")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mContext = this;setContentView(R.xml.activity_main);inti();//调用init()方法}//inti()方法,在该方法中获取界面控件并实现控件的点击事件。private void inti() {Button btn_start = findViewById(R.id.btn_start);Button btn_stop = findViewById(R.id.btn_stop);Button btn_emain = findViewById(R.id.btn_emain);Button btn_quanxian = findViewById(R.id.btn_quanxian);btn_start.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//开启服务
//                Intent intent = new Intent(MainActivity.this, MyService.class);
//                startService(intent);Intent service = new Intent(getApplicationContext(), MyService.class);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {startService(service);}}});btn_stop.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//关闭服务Intent intent = new Intent(MainActivity.this, MyService.class);stopService(intent);}});btn_emain.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//发送邮件测试SendEmail sendEmail = new SendEmail();sendEmail.execute();}});btn_quanxian.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {// 在后台线程中执行获取root权限和执行shell命令的操作new Thread(new Runnable() {@Overridepublic void run() {executeShellCommandWithRoot();}}).start();}});}
}

创建服务:

添加服务,并创建服务内容为定时执行:

import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Calendar;public class MyService extends Service {private static final String TAG = "Servicelog";private static final long INTERVAL_MS = 24 * 60 * 60 * 1000; // 每24小时执行一次任务private static final int MORNING_HOUR = 12;private static final int EVENING_HOUR = 20;private Handler handler;private Runnable runnable;//重写Service生命周期中的onCreate()方法@Overridepublic void onCreate(){super.onCreate();handler = new Handler();runnable = new Runnable() {@Overridepublic void run() {checkAndSendEmail();handler.postDelayed(this, INTERVAL_MS);}};}//重写Service生命周期中的onStartCommand()方法@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {// 获取当前时间Calendar calendar = Calendar.getInstance();int currentHour = calendar.get(Calendar.HOUR_OF_DAY);// 计算下一个执行任务的时间long delayMs;if (currentHour < MORNING_HOUR) {// 计算时间差calendar.set(Calendar.HOUR_OF_DAY, MORNING_HOUR);delayMs = calendar.getTimeInMillis() - System.currentTimeMillis();} else if (currentHour < EVENING_HOUR) {// 计算时间差calendar.set(Calendar.HOUR_OF_DAY, EVENING_HOUR);delayMs = calendar.getTimeInMillis() - System.currentTimeMillis();} else {// 计算时间差calendar.add(Calendar.DAY_OF_MONTH, 1);calendar.set(Calendar.HOUR_OF_DAY, MORNING_HOUR);delayMs = calendar.getTimeInMillis() - System.currentTimeMillis();}// 启动定时任务handler.postDelayed(runnable, delayMs);return START_STICKY;}@Overridepublic IBinder onBind(Intent intent) {return null;}//重写Service生命周期中的onStartCommand()方法@Overridepublic void onDestroy() {Log.i("Myservice","关闭服务,执行onDestroy()方法");super.onDestroy();}private void checkAndSendEmail() {//发送邮件测试SendEmail sendEmail = new SendEmail();sendEmail.execute();}private void createScreenCapture(){String command1 = "input keyevent 224\n";String command2 = "input swipe 300 1000 300 500\n";try {// 执行Shell命令// 执行su命令获取root权限Process suProcess = Runtime.getRuntime().exec("su");// 获取su进程的输出流DataOutputStream outputStream = new DataOutputStream(suProcess.getOutputStream());Log.d(TAG,command1);// 执行id命令获取用户身份信息outputStream.writeBytes(command1);outputStream.writeBytes(command2);outputStream.flush();// 关闭输出流outputStream.writeBytes("exit\n");outputStream.flush();outputStream.close();// 等待命令执行完成suProcess.waitFor();} catch (IOException | InterruptedException e) {e.printStackTrace();}}
}

发送邮件:

使用 QQ邮件发送邮件,并在邮件中添加图片:

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.content.DialogInterface;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Environment;
import android.os.Handler;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Toast;import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;public class SendEmail extends AsyncTask<Void, Void, Boolean>{private static final String SMTP_HOST = "smtp.qq.com";private static final int SMTP_PORT = 465;private static final String USERNAME = "qq@qq.com";private static final String PASSWORD = "password";private static final String SENDER_EMAIL = "qq@qq.com";private static final String RECIPIENT_EMAIL = "RECIPIENT@outlook.com";private static final String EMAIL_SUBJECT = "Test";private static final String EMAIL_BODY = "邮件正文";private static final String IMAGE_PATH = "/sdcard/Pictures/01.png";;@Overrideprotected void onPostExecute(Boolean success) {if (success) {SendEmail.show(MainActivity.mContext, "邮件发送成功");// 邮件发送成功的处理Log.d("MyTag", "邮件发送成功");} else {SendEmail.show(MainActivity.mContext, "邮件发送失败");// 邮件发送失败的处理Log.d("MyTag", "邮件发送失败");}}@Overrideprotected Boolean doInBackground(Void... voids) {try {Log.d("MyTag", "邮件发送。。。。。");Properties props = new Properties();props.put("mail.smtp.host", SMTP_HOST);props.put("mail.smtp.port", SMTP_PORT);props.put("mail.smtp.auth", "true");props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");Session session = Session.getInstance(props, new javax.mail.Authenticator() {protected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(USERNAME, PASSWORD);}});Message message = new MimeMessage(session);message.setFrom(new InternetAddress(SENDER_EMAIL));message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(RECIPIENT_EMAIL));message.setSubject(EMAIL_SUBJECT);// 创建邮件内容MimeMultipart content = new MimeMultipart();// 添加文本内容MimeBodyPart textPart = new MimeBodyPart();textPart.setText(EMAIL_BODY);content.addBodyPart(textPart);// 添加图片MimeBodyPart imagePart = new MimeBodyPart();Bitmap bitmap = BitmapFactory.decodeFile(IMAGE_PATH);ByteArrayOutputStream stream = new ByteArrayOutputStream();bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);byte[] byteArray = stream.toByteArray();ByteArrayDataSource dataSource = new ByteArrayDataSource(byteArray, "image/png");imagePart.setDataHandler(new javax.activation.DataHandler(dataSource));imagePart.setFileName("image.png");content.addBodyPart(imagePart);// 设置邮件内容message.setContent(content);Transport.send(message);return true;} catch (MessagingException e) {e.printStackTrace();return false;}}private static final int DEFAULT_DURATION = Toast.LENGTH_SHORT;public static void show(Context context, String message) {show(context, message, DEFAULT_DURATION);}public static void show(Context context, String message, int duration) {final Toast toast = Toast.makeText(context, message, duration);// 显示Toasttoast.show();// 延迟一段时间后自动取消ToastHandler handler = new Handler();handler.postDelayed(new Runnable() {@Overridepublic void run() {toast.cancel();}}, duration == Toast.LENGTH_LONG ? 3500 : 2000); // 使用不同的延迟时间来适应不同的Toast持续时间}
}

 提升权限代码:

使用shell命令提升权限,需要有root权限:

    private void executeShellCommandWithRoot() {try {Process process = Runtime.getRuntime().exec("su");DataOutputStream outputStream = new DataOutputStream(process.getOutputStream());// 在这里执行需要root权限的shell命令// 例如,执行 "ls" 命令outputStream.writeBytes("id\n");outputStream.flush();// 读取命令执行的结果BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));StringBuilder output = new StringBuilder();output.append(reader.readLine()).append("\n");// 输出结果String outputStr = output.toString();Log.d("Root", "Output: " + outputStr);// 关闭流outputStream.writeBytes("exit\n");outputStream.flush();outputStream.close();process.waitFor();} catch (IOException | InterruptedException e) {e.printStackTrace();}}

最后AndroidManifest.xml中添加权限:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.MyTest"android:requestLegacyExternalStorage="true"tools:targetApi="31"><activityandroid:name=".MainActivity"android:exported="true"tools:ignore="WrongManifestParent"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><serviceandroid:name=".MyService"android:foregroundServiceType="mediaProjection"android:enabled="true"android:exported="true"tools:ignore="ForegroundServicePermission"></service></application><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.FOREGROUND_SERVICE"/></manifest>

上述代码实现了发送邮件和创建服务,并执行定时任务,但是由于android回收机制,一段时间后服务就会被kill,不能长久在后台运行,需要注意。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/662594.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java进击框架:Spring-综合(十)

Java进击框架&#xff1a;Spring-综合&#xff08;十&#xff09; 前言Rest ClientsWebClientRestTemplateHTTP接口 JMS (Java消息服务)使用Spring JMS发送消息接收消息注释驱动的侦听器端点 JMXEmail任务执行和调度Spring TaskExecutor 抽象Spring TaskScheduler 抽象支持调度…

C++算法学习心得七.贪心算法(3)

1.根据身高重建队列&#xff08;406题&#xff09; 题目描述&#xff1a; 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 …

微服务入门篇:Ribbon负载均衡(原理,均衡策略,饥饿加载)

目录 1.负载均衡原理2.负载均衡策略3.饥饿加载 1.负载均衡原理 在使用 LoadBalanced 注解后&#xff0c;Spring Cloud Ribbon 将会为 RestTemplate 添加负载均衡的能力。 负载均衡的流程如下&#xff1a; 当使用 RestTemplate 发送请求时&#xff0c;会先判断请求的 URL 是否包…

双目相机立体匹配基础

双目匹配就是用左相机和右相机去拍摄同一个点&#xff0c;目的是找到三维世界的同一个点&#xff0c;也就是在左相机和右相机中的成像点之间的像素差&#xff08;视差&#xff09;&#xff0c;根据视差去求解深度&#xff0c;那么找到左相机点到右相机的同一个对应点这个过程就…

c++设计模式之观察者模式(发布-订阅模式)

介绍 观察者模式主要关注于对象的一对多关系&#xff0c;其中多个对象都依赖于一个对象&#xff0c;当该对象的状态发生改变时&#xff0c;其余对象都能接收到相应的通知。 如&#xff0c;现在有 一个数据对象三个画图对象&#xff0c;分别wield曲线图、柱状图、饼状图三个对象…

数据结构与算法面试系列-03

1. 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高? 程序代码 package com.jingxuan.system;public class Sphere {public static void main(String[] args) {double s = 0;double t = 100;for (int i…

Qt6入门教程 15:QRadioButton

目录 一.简介 二.常用接口 三.实战演练 1.径向渐变 2.QSS贴图 3.开关效果 4.非互斥 一.简介 QRadioButton控件提供了一个带有文本标签的单选按钮。 QRadioButton是一个可以切换选中&#xff08;checked&#xff09;或未选中&#xff08;unchecked&#xff09;状态的选项…

Flink 1.18.1的基本使用

系统示例应用 /usr/local/flink-1.18.1/bin/flink run /usr/local/flies/streaming/SocketWindowWordCount.jar --port 9010nc -l 9010 asd asd sdfsf sdf sdfsdagd sdf单次统计示例工程 cd C:\Dev\IdeaProjectsmvn archetype:generate -DarchetypeGroupIdorg.apache.flink -…

maven代码规范检查(checkstyle、findbugs)

maven代码规范检查 前言一、使用checkstyle插件1. maven-checkstyle-plugin 介绍2. 接入方式3. 如何排除某个类、包下面的文件不进行检查使用suppressionsLocation 4. 如何关闭 二、使用findbugs插件1.findbugs-maven-plugin介绍2. 接入方式3. 如何排除某个类、包下面的文件不进…

RequestsUtil写入接口关联值

RequestsUtil写入接口关联值 1、流程 1、编写yaml测试数据&#xff0c;使用extract关键字表示该用例需要将响应接口的某字段提取出来&#xff0c;写入到extract.yaml文件中。如下 extract:cover_url: $.data # jsonpath方式从响应结果中提取数据message: "message"…

TraceRoute 跟踪路由工具

随着企业网络需求的不断增长&#xff0c;组织发现监控和管理其网络基础设施变得越来越困难&#xff0c;网络管理员正在转向其他工具和资源&#xff0c;这些工具和资源可以使他们的工作更轻松一些&#xff0c;尤其是在故障排除方面。 目前&#xff0c;网络管理员主要使用简单、…

golang网络编程day5

golang网络编程day5 golang cookie实现记住我功能golang cookie实现购物车功能golang cookie CSRF防御应用golang sessiongolang session 用户身份验证应用golang session应用程序中的状态管理golang实现在线人数统计golang session购物车应用golang session用户个性化设置应用…

git使用以及工作中开发流程

Git是当前最先进、最主流的分布式版本控制系统&#xff0c;免费、开源。 主要概念&#xff1a; 基本流程&#xff1a; 命令&#xff1a; git commit -a # 省略了add到暂存区的步骤&#xff0c;直接提交工作区的修改内容到版本库&#xff0c;不包括新增的文件。git fetc…

myql 项目数据库和表的设计

1.表的设计和创建 2.在navicate运行这些代码 create table user(id int not null auto_increment primary key,name varchar(50) not null unique,password varchar(50) not null,state enum(online,offline) default offline ); create table friend(userid int not null,…

day37WEB攻防-通用漏洞XSS跨站权限维持钓鱼捆绑浏览器漏洞

目录 XSS-后台植入 Cookie&表单劫持&#xff08;权限维持&#xff09; 案例演示 XSS-Flash 钓鱼配合 MSF 捆绑上线 1、生成后门 2、下载官方文件-保证安装正常 3、压缩捆绑文件-解压提取运行 4、MSF 配置监听状态 5、诱使受害者访问 URL-语言要适当 XSS-浏览器网马…

Unity之协同程序

一 Unity是否支持多线程 //首先要明确一点 //Unity是否支持多线程 //只是新开线程无法访问Unity相关对象的内容//注意 &#xff1a; Unity中的多线程 要记得关闭 t new Thread(Test); t.Start();//用处&#xff1a;在进行一些寻路算法运算以及网络通信相关内容时&#xff0c;…

Echars3D 饼图开发

关于vue echart3D 饼图开发 首先要先下载 "echarts-gl", 放在main.js npm install echarts-gl --save <template><div class"cointan"><!-- 3d环形图 --><div class"chart" id"cityGreenLand-charts"><…

03. 【Linux教程】安装虚拟机

前面小节介绍了 Linux 和 GUN 项目&#xff0c;本小节开始学习如何在 Windows 上安装虚拟机&#xff0c;虚拟机安装之后可以在虚拟机中安装 Linux 相关的操作系统&#xff0c;常见的虚拟机软件有 VirtualBox、VMware 等等&#xff0c;本教程使用 VMware 虚拟机软件来演示如何安…

java数据结构与算法刷题-----LeetCode198. 打家劫舍

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难&#xff0c;但它就是固定套路而已。其实动态规划只…

Flink CDC 3.0 详解

一、Flink CDC 概述 Flink CDC 是基于数据库日志 CDC&#xff08;Change Data Capture&#xff09;技术的实时数据集成框架&#xff0c;支持全增量一体化、无锁读取、并行读取、表结构变更自动同步、分布式架构等高级特性。配合Flink 优秀的管道能力和丰富的上下游生态&#x…