Android设置app开机自启,网络监听,主线程完成UI渲染,HTTP网络请求工具,json数据处理,android使用sqlite,Android定时任务,日志打印

这篇具有很好参考价值的文章主要介绍了Android设置app开机自启,网络监听,主线程完成UI渲染,HTTP网络请求工具,json数据处理,android使用sqlite,Android定时任务,日志打印。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android7.1.1开机自动启动配置

在AndroidManifest.xml文件中添加权限

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

在AndroidManifest.xml文件中注册接收广播配置, 添加到manifest > application节点下

<receiver
    android:name=".MyReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter android:priority="1000">
	<action android:name="android.intent.action.BOOT_COMPLETED"></action>
    </intent-filter>
</receiver>

在AndroidManifest.xml文件中添加节点属性, 指定安装目录为内部存储器, 而非SD卡

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:installLocation="internalOnly">

开机启动执行代码

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

/**
 * 接收开机广播
 */
public class MyReceiver extends BroadcastReceiver {
    public MyReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
            Intent i = new Intent(context, MainActivity.class);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);
        }
    }
}

网络联网监听

public class NetWorkUtil {
    public static boolean checkNetworkState(MainActivity mainActivity) {
        //使用ConnectivityManager检查网络状态步骤
        ConnectivityManager connectivityManager = (ConnectivityManager) mainActivity.getSystemService(CONNECTIVITY_SERVICE);//1.通过系统服务获取ConnectivityManager类的对象
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();//2.调用getActiveNetworkInfo()获取当前活动的网络NetworkInfo对象
        //3.判断当前网络状态是否为连接状态,如果当前没有网络是活动的,则返回null
        if (networkInfo != null && networkInfo.isConnected()) {
            MainActivity.toast.setText("您已连接网络");
            MainActivity.toast.show();
            MainActivity.timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    String res = HttpUtil.get(URLConst.SERVER_URL);
                    if (res == null) {
                        MainActivity.timer.schedule(new TimerTask() {
                            @Override
                            public void run() {
                                MainActivity.toast.setText("您与服务器的通讯异常, 数据可能会同步失败!");
                                MainActivity.toast.show();
                            }
                        }, 3000);
                    } else {
                        Map map = JSONUtil.toObject(res, Map.class);
                        if (map.get("code").toString().startsWith("200")) {
                            MainActivity.timer.schedule(new TimerTask() {
                                @Override
                                public void run() {
                                    MainActivity.toast.setText("您与服务器的通讯正常!");
                                    MainActivity.toast.show();
                                }
                            }, 3000);
                        } else {
                            MainActivity.timer.schedule(new TimerTask() {
                                @Override
                                public void run() {
                                    MainActivity.toast.setText("您与服务器的通讯异常, 数据可能会同步失败!");
                                    MainActivity.toast.show();
                                }
                            }, 3000);
                        }
                    }
                }
            }, 1000);
            return true;
        } else {
            MainActivity.toast.setText("您已断开网络");
            MainActivity.toast.show();
            return false;
        }
        // 检测和服务器之间的连接
    }
}

UI主线程才能执行界面渲染, 其他线程执行渲染都会报错

MainActivity.this.runOnUiThread(() -> {
    EditText edit = (EditText) findViewById(R.id.txt_msg);
    String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINESE).format(new Date());
    long tid = Thread.currentThread().getId();
    String txt = String.format("%s\r\n%s - %d: %s", edit.getText(), now, tid, msg);
    edit.setText(txt);
    edit.setSelection(edit.getText().length());
});

网络HTTP请求工具类

import android.util.Log;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;

public class HttpUtil {
    public static String postJson(String url, HashMap<String, String> headerMap, Object data) {
        HttpURLConnection conn = null;
        try {
            Log.d("main", "请求准备" + url);
            conn = (HttpURLConnection) new URL(url).openConnection();
            conn.setRequestMethod("POST");//设置POST请求方式
            conn.setConnectTimeout(5000);//设置超时时间

            conn.setRequestProperty("Content-Type", "application/json");
//            if (data == null) {
//                data = new Object();
//            }
            String jsonStr = JSONUtil.toJSONString(data);
            Log.d("main", "请求准备 - 已添加参数" + jsonStr);
            byte[] bytes = jsonStr.getBytes(StandardCharsets.UTF_8);
            Log.d("main", "请求准备 - 参数大小" + bytes.length);
            conn.setRequestProperty("Content-Length", String.valueOf(bytes.length));//设置请求头,设置提交数据的长度
            if (headerMap != null) {
                for (String key : headerMap.keySet()) {
                    conn.setRequestProperty(key, headerMap.get(key));
                }
            }
            Log.d("main", "请求准备 - 已添加请求头");

            conn.setDoOutput(true);//设置允许向外写数据
            conn.connect();//连接
            Log.d("main", "请求准备 - 连接");

            //4.通过getOutputStream()获得输出流往服务器写数据
            OutputStream outputStream = conn.getOutputStream();//通过getOutputStream()获得输出流
            outputStream.write(jsonStr.getBytes());
            Log.d("main", "请求准备 - 写入数据");

            int code = conn.getResponseCode();//获取HTTP状态码
            Log.d("main", "响应处理 - 获取状态码");
            if (code == HttpURLConnection.HTTP_OK) {//5.得到响应码并判断连接正常后,通过getInputStream()方法获得携带服务器返回信息的输入流,从流中读取出服务器返回值,并向handler发送消息
                System.out.println(conn.getResponseCode());//控制台输出
                InputStream inputStream = conn.getInputStream();//得到响应流(通过getInputStream()方法获取携带服务器返回信息的输入流)
                byte[] dataBytes = parseResponse(inputStream);
                String msg = new String(dataBytes, StandardCharsets.UTF_8);
                Log.d("main", msg);
                return msg;
            } else {
                Log.d("main", "请求失败了" + conn.getResponseCode());
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.d("main", "请求异常了");
        } finally {
            if (conn != null) {
                conn.disconnect();//关闭HTTP连接
            }
        }
        return null;
    }

    public static String get(String url) {
        HttpURLConnection conn = null;
        try {
            Log.d("main", "请求准备" + url);
            conn = (HttpURLConnection) new URL(url).openConnection();
            conn.setRequestMethod("GET");
            conn.setConnectTimeout(5000);//设置超时时间

            conn.connect();//连接
            Log.d("main", "请求准备 - 连接");

            int code = conn.getResponseCode();//获取HTTP状态码
            Log.d("main", "响应处理 - 获取状态码");
            if (code == HttpURLConnection.HTTP_OK) {//5.得到响应码并判断连接正常后,通过getInputStream()方法获得携带服务器返回信息的输入流,从流中读取出服务器返回值,并向handler发送消息
                System.out.println(conn.getResponseCode());//控制台输出
                InputStream inputStream = conn.getInputStream();//得到响应流(通过getInputStream()方法获取携带服务器返回信息的输入流)
                byte[] dataBytes = parseResponse(inputStream);
                String msg = new String(dataBytes, StandardCharsets.UTF_8);
                Log.d("main", msg);
                return msg;
            } else {
                Log.d("main", "请求失败了" + conn.getResponseCode());
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.d("main", "请求异常了" + e.getMessage());
        } finally {
            if (conn != null) {
                conn.disconnect();//关闭HTTP连接
            }
        }
        return null;
    }

    private static byte[] parseResponse(InputStream input) {
        byte[] buff = new byte[1024];
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        int len;
        try {
            while ((len = input.read(buff)) != -1) {
                byteArrayOutputStream.write(buff, 0, len);
            }
            return byteArrayOutputStream.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
}

Android处理json数据, 添加gson依赖

gson是谷歌…
implementation ‘gson-2.8.5’
依赖无法下载, 直接使用jar包, 将jar包放到libs目录下, 然后到build.gradle文件中, dependencies节点下添加implementation(fileTree(“libs”)); 然后创建工具类

import com.google.gson.Gson;

public class JSONUtil {
    public static String toJSONString(Object o) {
        Gson gson = new Gson();
        return gson.toJson(o);
    }

    public static <T> T toObject(String json, Class<T> tClass) {
        Gson gson = new Gson();
        return gson.fromJson(json, tClass);
    }
}

在Android中使用sqlite

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至2021年已经接近有21个年头,SQLite也迎来了一个版本 SQLite 3已经发布。

历史

从某种程度上说,SQLite最初的构思是在一条军舰上进行的。当时在通用动力工作的SQLite的作者 [1] D. Richard Hipp正在为美国海军编制一种使用在导弹驱逐舰上的程序。那个程序最初运行在Hewlett-Packard UNIX(HPUX)上,后台使用Informix数据库。对那个具体应用而言,Informix有点儿太强大了。一个有经验的数据库管理员(DBA)安装或升级Informix可能需要一整天,如果是没经验的程序员,这个工作可能永远也做不完。真正需要的只是一个自我包含的数据库,它易使用并能由程序控制传导,另外,不管其他软件是否安装,它都可以运行。

2000年1月,Hipp开始和一个同事讨论关于创建一个简单的嵌入式SQL数据库的想法,这个数据库将使用GNU DBM哈希库(gdbm)做后台,同时这个数据库将不需要安装和管理支持。后来,一有空闲时间,Hipp就开始实施这项工作,2000年8月,SQLite 1.0版发布了。

按照原定计划,SQLite 1.0用gdbm作为存储管理器。然而,Hipp不久就用自己实现的能支持事务和记录按主键存储的B-tree替换了gdbm。随着第一次重要升级的进行,SQLite有了稳定的发展,功能和用户也在增长。2001年中期,很多项目–开源的或商业的–都开始使用SQLite。在随后的几年中,开源社区的其他成员开始为他们喜欢的脚本语言和程序库编写SQLite扩展。一个接着一个,既Perl、Python、Ruby、Java和其他主流的程序设计语言的扩展之后,新的扩展如SQLite的ODBC接口出现并证明了SQLite的广泛应用和实用功能。
2004年,SQLite从版本2升级到版本3,这是一次重大升级。

Android中使用sqlite的使用工具类

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import androidx.annotation.Nullable;

/**
 * MySqliteOpenHelper 工具类 单例模式(1.构造函数私有化,2.对外提供函数。)
 */
// 该类就可以理解为一个数据库了。
public class MySqliteOpenHelper extends SQLiteOpenHelper {

    // 单例模式
    private static SQLiteOpenHelper mInstance;

    // 提供对外提供的函数。
    public static synchronized SQLiteOpenHelper getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new MySqliteOpenHelper(context, "security_detector.db", null, 1);
        }
        return mInstance;
    }

    /**
     * 通过构造函数,将数据库名称,数据库版本号等定义出来。因此,必须要声明一个构造函数。
     *
     * @param context context就是环境,在此环境下进行创建数据库。
     * @param name    数据库名称
     * @param factory 工厂
     * @param version 版本 数据库升级后需要不断加1操作!
     */
    public MySqliteOpenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    /**
     * 数据库初始化用的:
     * 创建表 表数据初始化 数据库第一次创建的时候调用。第二次发现有该表了就不会重复创建了!
     * 此函数只会执行一次。 因此,添加了新的数据库或者修改了数据库,必须要对应项目目录将databases目录下的db等文件删除。
     *
     * @param sqLiteDatabase
     */
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        String sql = "create table serial_setting(" +
                "_id integer primary key autoincrement," +
                "updated_time DATETIME" +
                ")";
        // 执行sql
        sqLiteDatabase.execSQL(sql);
    }

    // 数据库升级用的
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }

}

添加数据库 sqlite DDL

增删改都是执行execSQL, 查询用rawQuery

private void initScreenData() {
    SQLiteOpenHelper helper = MySqliteOpenHelper.getInstance(this);
    // 读数据
    SQLiteDatabase db = helper.getReadableDatabase();
    if (db.isOpen()) {
        Cursor cursor = db.rawQuery("SELECT * FROM serial_setting;", null);
        if (cursor.getCount() == 0) {
            Log.d("main", "第一次加载, 开始初始化数据");
            // 初始化
            String sql = "insert into serial_setting(updated_time)";
            sql += "values(?)";
            Object[] args = new Object[]{
                    new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINESE).format(new Date())
            };
            db.execSQL(sql, args);
        } else {
            try {
                cursor.moveToNext();
                int id = cursor.getInt(cursor.getColumnIndex("_id"));
                String updatedTime = cursor.getString(cursor.getColumnIndex("updated_time"));
            } catch (NumberFormatException e) {
                e.printStackTrace();
                Log.d("main", "设置数据库存储的数据失败, 可能有空值!");
            }
        }
        cursor.close();
        db.close();
    }
}

Android中使用定时任务

同Java一样, 使用java.util.Timer
每个timer都是一个执行者, TimerTask是要完成的事, timer在启动时就会创建一个线程和队列用于执行内部队列任务, 执行schedule会添加任务到任务队列中

Timer timer = new Timer();
// 定时执行数据发送(如果存在)
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        if (System.currentTimeMillis() - bufferUpdatedTime >= intervalTime) {
            // 超过更新时间, 处理本次数据
            if (buffer.length() != 0) {
                Log.d("main", "发送数据");
                sendBufferData();
            } else {
                Log.d("main", "数据为空, 放弃发送数据");
            }
        }
    }
}, intervalTime, intervalTime);

打印屏幕提示信息

直接初始化一个Toast或方法, 多页面共用文章来源地址https://www.toymoban.com/news/detail-771167.html

public static Toast toast = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (toast == null) {
        toast = Toast.makeText(MainActivity.this, "", Toast.LENGTH_SHORT);
    }
}

到了这里,关于Android设置app开机自启,网络监听,主线程完成UI渲染,HTTP网络请求工具,json数据处理,android使用sqlite,Android定时任务,日志打印的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CentOS设置开机自启脚本

    通过 /etc/rc.d/rc.local 方式设置开机自启 编写要执行的脚本 添加以下内容

    2024年02月07日
    浏览(41)
  • Nacos 虚拟机设置开机自启

    执行命令 : vi /lib/systemd/system/nacos.service 创建并编辑文件 将下面的代码放入此文件中,其中注意自己nacos的位置,即 ExecStart 与 ExecReload 与 ExecStop 后面的nacos相关路径 执行命令 systemctl daemon-reload 执行命令 systemctl enable nacos.service 启动nacos: systemctl start nacos 查看状态 : systemctl status

    2024年02月16日
    浏览(45)
  • Android如何实现开机自启

    开机自启有很多种办法,下面用广播的方式实现。 1、首先先创建广播,开机代码 2、在清单文件里面注册,同时添加权限 完成

    2024年02月14日
    浏览(34)
  • linux设置redis服务(开机自启)

    (1)、安装redis (2)、找到redis 安装目录 如启动文件所在目录: /usr/local/redis/redis-6.0.0/bin/redis-server 配置文件目录: /usr/local/redis/redis-6.0.0/etc/redis.conf 保存文件! 接下来就可以用服务操作redis(可以直接用redis,也可以用redis.service):

    2024年02月15日
    浏览(46)
  • linux设置pg库开机自启

    要在Linux系统上设置PostgreSQL数据库开机自启,可以按照以下步骤操作: 打开终端并使用root权限登录系统。 编辑 /etc/rc.local 文件: sudo vi /etc/rc.local 在文件的最后一行添加以下内容: su - postgres -c \\\"/usr/local/pgsql/bin/pg_ctl start -D /usr/local/pgsql/data -l /var/log/postgresql.log\\\" 这里假设你的

    2024年02月13日
    浏览(52)
  • docker常用命令及设置开机自启

    1. 创建容器时设置: 2. 更新已有容器设置: –restart具体参数,详见官方文档说明 Policy Result no Do not automatically restart the container when it exits. This is the default. 默认设置,容器退出时不重启容器。 on-failure[:max-retries] Restart only if the container exits with a non-zero exit status. Optionally, limit th

    2024年02月11日
    浏览(40)
  • Ubuntu 18.04 设置开机自启脚本

    一、背景 同伴在频繁更新系统环境,需要经常使用reboot命令重启,但每次重启后端Jar都会停止,每次重启都需要手动启动Web后端Jar包。针对此种情况,想到了采用开机自动启动Jar包的方法来节省时间。 二、详细步骤 1. 编写你想要开机自动执行的命令。 切换到你想要装脚本的

    2023年04月10日
    浏览(40)
  • Ubuntu 22.04 设置开机自启脚本

    背景:系统采用docker容器形式部署方式,docker的形式存在每次启动服务器时所有服务同时启动,没有先后顺序,本次系统有应到mqtt,mqtt需在其他服务之前启动,否则会存在通信异常情况,所以本次应用了开机自启服务,开机执行顺序脚本,以达到应用到mqtt的服务后启动。

    2024年02月02日
    浏览(56)
  • Docker部署RustDesk Server 设置开机自启

    三、Docker安装 Docker官方和国内daocloud都提供了一键安装的脚本,使得Docker的安装更加便捷。 官方的一键安装方式: curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 国内 daocloud一键安装命令: curl -sSL https://get.daocloud.io/docker | sh 执行上述任一条命令,耐心等待即可完成Dock

    2024年02月10日
    浏览(43)
  • Widows下安装Nginx并设置开机自启

    下载地址:http://nginx.org/en/download.html nginx的启动方式有两种:一种是直接点击nginx.exe启动,另一种是通过命令行启动 2.1 直接启动 找到nginx目录,双击nginx.exe 即可启动 2.2 命令行启动 在nginx目录地址栏输入cmd,进入cmd窗口输入下列命令行 nginx.exe 或者 start nginx 2.3 检验是否启动

    2024年02月16日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包