JetPack入门

 

先导入依赖

   implementation("androidx.lifecycle:lifecycle-extensions:2.2.0")

1.使用LifeCycle解耦页面与组件 

Activity

package com.tiger.lifecycle;import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.SystemClock;
import android.widget.Chronometer;import androidx.appcompat.app.AppCompatActivity;public class Step2Activity extends AppCompatActivity {private MyChronometer chronometer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);chronometer = findViewById(R.id.chronometer);getLifecycle().addObserver(chronometer);//给自定义组件添加 Activity生命周期的这个一个监听}}

自定义组件

package com.tiger.lifecycle;import android.content.Context;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.widget.Chronometer;import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;public class MyChronometer extends Chronometer implements LifecycleObserver {private long elapsedTime=0;public MyChronometer(Context context, AttributeSet attrs) {super(context, attrs);}@OnLifecycleEvent(Lifecycle.Event.ON_RESUME) //在 resume 生命周期执行private void startMeter(){setBase(SystemClock.elapsedRealtime()-elapsedTime);start();}@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)//在 PAUSE 生命周期执行private void stopMeter(){elapsedTime = SystemClock.elapsedRealtime() - getBase();stop();}}

xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"tools:context=".Step1Activity"><com.tiger.lifecycle.MyChronometerandroid:id="@+id/chronometer"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"android:textSize="30sp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"></com.tiger.lifecycle.MyChronometer></androidx.constraintlayout.widget.ConstraintLayout>

2.使用LifeCycle解耦Service与组件

activity

package com.tiger.lifecycle;import android.content.Intent;
import android.os.Bundle;
import android.view.View;import androidx.appcompat.app.AppCompatActivity;public class Step3Activity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main_two);}public void startGps(View view) {startService(new Intent(this,MyLocationService.class));}public void stopGps(View view) {stopService(new Intent(this,MyLocationService.class));}
}

service 

package com.tiger.lifecycle;import android.util.Log;import androidx.lifecycle.LifecycleService;public class MyLocationService extends LifecycleService {public MyLocationService() {Log.d("ning","MyLocationService init");MyLocationObserver myLocationObserver = new MyLocationObserver(this);getLifecycle().addObserver(myLocationObserver);}}

observer

package com.tiger.lifecycle;import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;import java.util.List;public class MyLocationObserver implements LifecycleObserver {private Context context;private LocationManager locationManager;private MyLocationListener myLocationListener;public MyLocationObserver(Context context) {this.context = context;}@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)private void startGetLocation() {Log.d("ning","startGetLocation");locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);myLocationListener = new MyLocationListener();if (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {//不满足就退出方法return;}locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 1, myLocationListener);//提供监听 GPS提供 ,每3秒获取一下信息,每拿手机移动一米获取一下信息}@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)private void stopGetLocation(){Log.d("ning","stopGetLocation");locationManager.removeUpdates(myLocationListener);}static class MyLocationListener implements LocationListener{@Overridepublic void onLocationChanged(@NonNull Location location) {Log.d("ning","Location Changed "+location.toString());}@Overridepublic void onLocationChanged(@NonNull List<Location> locations) {LocationListener.super.onLocationChanged(locations);}@Overridepublic void onFlushComplete(int requestCode) {LocationListener.super.onFlushComplete(requestCode);}@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {LocationListener.super.onStatusChanged(provider, status, extras);}@Overridepublic void onProviderEnabled(@NonNull String provider) {LocationListener.super.onProviderEnabled(provider);}@Overridepublic void onProviderDisabled(@NonNull String provider) {LocationListener.super.onProviderDisabled(provider);}}}

3.使用ProcessLifecycleOwner监听应用程序生命周期

package com.tiger.lifecycle;import android.util.Log;import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;public class ApplicationObserver implements LifecycleObserver {private String TAG = "ning";@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)public void onCreate() {Log.d(TAG, "Lifecycle.Event.ON_CREATE");}@OnLifecycleEvent(Lifecycle.Event.ON_START)public void onStart() {Log.d(TAG, "Lifecycle.Event.ON_START");}@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)public void onResume() {Log.d(TAG, "Lifecycle.Event.ON_RESUME");}@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)public void onPause() {Log.d(TAG, "Lifecycle.Event.ON_PAUSE");}@OnLifecycleEvent(Lifecycle.Event.ON_STOP)public void onStop() {Log.d(TAG, "Lifecycle.Event.ON_STOP");}@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)public void onDestroy() {Log.d(TAG, "Lifecycle.Event.ON_DESTROY");}}

 MyApplication

package com.tiger.lifecycle;import android.app.Application;
import android.util.Log;import androidx.lifecycle.ProcessLifecycleOwner;public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();ProcessLifecycleOwner.get().getLifecycle().addObserver(new ApplicationObserver());//只有一个会执行,多个Activity只执行一次Log.d("ning","MyApplication onCreate");}
}

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

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

相关文章

[Python人工智能] 四十二.命名实体识别 (3)基于Bert+BiLSTM-CRF的中文实体识别万字详解(异常解决中)

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前文讲解如何实现中文命名实体识别研究,构建BiGRU-CRF模型实现。这篇文章将继续以中文语料为主,介绍融合Bert的实体识别研究,使用bert4keras和kears包来构建Bert+BiLSTM-CRF模型。然而,该代码最终结…

【Haproxy】Haproxy的配置和应用

HAProxy介绍 HAProxy是法国开发者威利塔罗(Willy Tarreau)在2000年使用C语言开发的一个开源软件&#xff0c;是一款具备高并发(一万以上)、高性能的TCP和HTTP负载均衡器&#xff0c;支持基于cookie的持久性&#xff0c;自动故障切换&#xff0c;支持正则表达式及web状态统计&a…

python | %d,%2d,%-2d,%.2d,%02d的区别

1&#xff09;%d &#xff1a;普通输出整型 2&#xff09;%2d&#xff1a;2为整型的宽度&#xff0c;不足2位向左补空格 3&#xff09;%-2d&#xff1a;2为整型的宽度&#xff0c;不足2位向右补空格 4&#xff09;%.2d&#xff1a;最少输出2位&#xff0c;不足2位则在前面补…

10个高级的SQL查询方法

大家好&#xff0c;SQL 是管理和分析关系数据库的基本工具。掌握基本的SQL命令能够完成简单的数据查询和操作&#xff0c;但是如果想从数据中提取更有价值的信息&#xff0c;数据分析工作者应该深入学习和掌握高级的SQL技巧。 1.窗口函数 窗口函数是指在SQL查询中对一组相关行…

【排序】七大排序表格比较

排序 时间复杂度 空间复杂度 最坏时间复杂度 最好时间复杂度 稳定性 插入排序 O(n) O(1) O(n) O(n) 稳定 希尔排序 O(nlogn)-O(n)取决于增量序列 O(1) O(n^1.3) O(nlogn) 不稳定 选择排序 O(n) O(1) O(n) O(n) 不稳定 冒泡排序 O(n) O(1) O(n) O(n…

[eslint error] ‘v-model‘ should be on a new line.

错误详情 错误原因 此问题是由于.eslintrc.js文件中的vue/max-attributes-per-line配置错误产生的 esline默认要求属性单独开一行 错误解决 所以解决的方法有两个一个是遵从eslint默认规则让属性新开一行,能解决问题 但是我不喜欢看这样子的代码,所以我只好去改掉eslint的规…

2024.02.05校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、校招 | 京东2024校招这些岗位持续热招中&#xff08;内推&#xff09; 校招 | 京东2024校招这些岗位持续热招中&#xff08;内推&#xff09; 2、校招 | 科捷智能2024全球校园招聘进行…

什么是数据采集与监视控制系统(SCADA)?

SCADA数据采集是一种用于监控和控制工业过程的系统。它可以实时从现场设备获得数据并将其传输到中央计算机&#xff0c;以便进行监控和控制。SCADA数据采集系统通常使用传感器、仪表和控制器收集各种类型的数据&#xff0c;例如温度、压力、流量等&#xff0c;然后将这些数据汇…

chrome插件:离线安装/详细步骤

一、工具按钮/三个点&#xff0c;拓展程序&#xff0c;管理拓展程序&#xff0c;加在已解压的拓展程序 添加后即可使用 二、工具按钮/三个点&#xff0c;拓展程序&#xff0c;管理拓展程序&#xff0c;拖放已解压的文件/Modheader 拖放后出现的页面 点击图标&#xff0c;查看…

JavaScript版本

JavaScript 由 Brendan Eich 于 1995 年发明&#xff0c;并于 1997 年成为 ECMA 标准。 ECMAScript 是该语言的官方名称。 从 2015 年起&#xff0c;ECMAScript 按年命名&#xff08;ECMAScript 2015&#xff09;。 ECMAScript Editions 版本官方名称描述1ECMAScript 1 (199…

SpringCloud基础

SpringCloud基础环境 1、基本环境版本选择 Java&#xff1a; Java17&#xff1b;spring cloud&#xff1a;2023.0.0&#xff1b;spring boot&#xff1a;3.2.0&#xff1b;cloud alibaba&#xff1a;2022.0.0.0-RC2&#xff1b;Maven&#xff1a;3.9&#xff1b;Mysql&#x…

C++ Qt开发:QNetworkInterface网络接口组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍如何运用QNetworkInterface组件实现查询详细的…

Ubuntu18/20运行ORB-SLAM3

ORB-SLAM3复现(ubuntu18/20) 文章目录 ORB-SLAM3复现(ubuntu18/20)1 坐标系与外参Intrinsic parameters2 内参Intrinsic parameters2.1 相机内参① 针孔模型Pinhole② KannalaBrandt8模型③ Rectified相机 2.2 IMU内参 3 VI标定—外参3.1 Visual calibration3.2 Inertial calib…

蓝桥杯2023年-飞机降落(暴力枚举,next_permutation)

题目描述 N 架飞机准备降落到某个只有一条跑道的机场。其中第 i 架飞机在 Ti 时刻到达机场上空&#xff0c;到达时它的剩余油料还可以继续盘旋 Di 个单位时间&#xff0c;即它最早 可以于 Ti 时刻开始降落&#xff0c;最晚可以于 Ti Di 时刻开始降落。降落过程需要 Li个单位…

软件测试工程师的一天工作内容是什么?

相信但凡提出这个问题&#xff0c;基本上都是准备入行或转行&#xff0c;又各种纠结的小伙伴。测试工程师到底都些干啥&#xff1f;加班多不多?薪资高不高?前景怎么样?有没有35岁焦虑问题&#xff1f;让我们挨个问题盘一下。 一、测试人员的日常 9&#xff1a;30 到公司 打…

[贰],万能开篇HelloWorld

1&#xff0c;新建项目 File/New/Project Android/Android Application Project 输入程序名字HelloWorld Next Next 选择Blank Activity 修改为HelloWorldActivity 2&#xff0c;异常点 No resource found that matches the given name Theme.AppCompat.Light import andro…

vue3引入高德地图

首先注册高德key https://console.amap.com/dev/key/a vue项目中安转地图包 pnpm i amap/amap-jsapi-loader -S 先说最重要核心&#xff0c;踩雷过 页面中需写入以下代码&#xff0c;现在注册的高德key要求强制写入安全密钥 window._AMapSecurityConfig {securityJsCode…

CorelDRAW Essentials2024使用简单易学的图形软件,让设计充满乐趣

CorelDRAW Essentials 2024使用简单易学的图形软件&#xff0c;让设计充满乐趣 创作引人注目的海报、卡片、社交媒体图片等。 增强功能&#xff01;支持文件导入/导出新增功能&#xff01;支持 WebP 文件&#xff0c;提高网页兼容性并优化图像交付增强功能&#xff01;显著的…

深入理解 SCSS:强大的 CSS 预处理器

深入理解 SCSS:强大的 CSS 预处理器 在现代前端开发中,CSS 预处理器已经成为了一个不可或缺的工具。SCSS (Sassy CSS) 作为最流行的 CSS 预处理器之一,以其强大的功能和简洁的语法,受到了广大开发者的青睐。本文将深入探讨 SCSS 的使用说明,并通过高级典型的使用案例,帮助您更…

Independent Variable Dependent Variable

自变量&#xff08;Independent Variable&#xff09; -----------> 因变量&#xff08;Dependent Variable&#xff09; 数据 ----------------------------------------------结果&#xff0c;报告等等