Android Service两种启动方式

2023-11-03

1.Context.startService()方式启动 

①Context.startService()方式的生命周期: 启动时,startService –> onCreate() –> onStart()(可多次调用) ,Service running,停止时,stopService –> onDestroy()

note:

Service未被创建并运行时,则android先调用onCreate(),然后调用onStart()。

如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。

同上,如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次。 

采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()。如果是调用者自己(即启动服务的应用或活动)直接退出而没有调用stopService的话,Service会一直在后台运行 Context.startService()方法启动服务,该Service的调用者再启动起来后可以通过stopService关闭Service。

服务可以通过Service.stopSelf()方法或者Service.stopSelfResult()方法来停止自己,只要调用一次stopService()方法便可以停止服务,无论调用了多少次的启动服务方法。

2.Context.bindService()方式启动:

①Context.bindService()方式的生命周期: 绑定时,bindService -> onCreate() –> onBind()(只一次,不可多次绑定)->onServiceConnected,Service running, 调用者退出了,即解绑定时,Srevice就会unbindService –>onUnbind() –> onDestory()

note:

Context.bindService()方式启动 Service的方法:绑定Service需要三个参数:bindService(intent, conn, Service.BIND_AUTO_CREATE);第一个:Intent对象第二个:ServiceConnection对象,创建该对象要实现它的onServiceConnected()和 onServiceDisconnected()来判断连接成功或者是断开连接第三个:如何创建Service,一般指定绑定的时候自动创建。

onBind()将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service的实例、运行状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。 


两种启动方式,在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。



下面的应用,分别使用startService和bindService来启动本地的服务。

1.Context.startService()方式启动 

简单的音乐播放

Activity

[java]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
  1. public class PlayMusicService extends Activity implements OnClickListener {  
  2.   
  3.     private Button playBtn;  
  4.     private Button stopBtn;  
  5.     private Button pauseBtn;  
  6.     private Button exitBtn;  
  7.     private Button closeBtn;  
  8.   
  9.     private Intent intent;  
  10.       
  11.     @Override  
  12.     public void onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.         setContentView(R.layout.music_service);  
  15.   
  16.         playBtn = (Button) findViewById(R.id.play);  
  17.         stopBtn = (Button) findViewById(R.id.stop);  
  18.         pauseBtn = (Button) findViewById(R.id.pause);  
  19.         exitBtn = (Button) findViewById(R.id.exit);  
  20.         closeBtn = (Button) findViewById(R.id.close);  
  21.           
  22.         playBtn.setOnClickListener(this);  
  23.         stopBtn.setOnClickListener(this);  
  24.         pauseBtn.setOnClickListener(this);  
  25.         exitBtn.setOnClickListener(this);  
  26.         closeBtn.setOnClickListener(this);  
  27.   
  28.     }  
  29.   
  30.     @Override  
  31.     public void onClick(View v) {  
  32.         int op = -1;  
  33.         intent = new Intent("com.homer.service.musicService");  
  34.   
  35.         switch (v.getId()) {  
  36.         case R.id.play:                             // play music  
  37.             op = 1;  
  38.             break;  
  39.         case R.id.stop:                             // stop music  
  40.             op = 2;  
  41.             break;  
  42.         case R.id.pause:                            // pause music  
  43.             op = 3;  
  44.             break;  
  45.         case R.id.close:                            // close activity  
  46.             this.finish();  
  47.             break;  
  48.         case R.id.exit:                             // stopService  
  49.             op = 4;  
  50.             stopService(intent);  
  51.             this.finish();  
  52.             break;  
  53.         }  
  54.   
  55.         Bundle bundle = new Bundle();  
  56.         bundle.putInt("op", op);  
  57.         intent.putExtras(bundle);  
  58.           
  59.         startService(intent);                           // startService  
  60.     }  
  61.       
  62.     @Override  
  63.     public void onDestroy(){  
  64.         super.onDestroy();  
  65.   
  66.         if(intent != null){  
  67.             stopService(intent);  
  68.         }  
  69.     }  
  70. }  


Service

[java]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
  1. public class MusicService extends Service {  
  2.     private static final String TAG = "MyService";  
  3.       
  4.     private MediaPlayer mediaPlayer;  
  5.   
  6.     @Override  
  7.     public IBinder onBind(Intent arg0) {  
  8.         return null;  
  9.     }  
  10.   
  11.     @Override  
  12.     public void onCreate() {  
  13.         Log.v(TAG, "onCreate");  
  14.         Toast.makeText(this"show media player", Toast.LENGTH_SHORT).show();  
  15.   
  16.         if (mediaPlayer == null) {  
  17.             mediaPlayer = MediaPlayer.create(this, R.raw.tmp);  
  18.             mediaPlayer.setLooping(false);  
  19.         }  
  20.     }  
  21.   
  22.     @Override  
  23.     public void onDestroy() {  
  24.         Log.v(TAG, "onDestroy");  
  25.         Toast.makeText(this"stop media player", Toast.LENGTH_SHORT);  
  26.         if (mediaPlayer != null) {  
  27.             mediaPlayer.stop();  
  28.             mediaPlayer.release();  
  29.         }  
  30.     }  
  31.   
  32.     @Override  
  33.     public void onStart(Intent intent, int startId) {  
  34.         Log.v(TAG, "onStart");  
  35.         if (intent != null) {  
  36.             Bundle bundle = intent.getExtras();  
  37.             if (bundle != null) {  
  38.                 int op = bundle.getInt("op");  
  39.                 switch (op) {  
  40.                 case 1:  
  41.                     play();  
  42.                     break;  
  43.                 case 2:  
  44.                     stop();  
  45.                     break;  
  46.                 case 3:  
  47.                     pause();  
  48.                     break;  
  49.                 }  
  50.             }  
  51.         }  
  52.     }  
  53.   
  54.     public void play() {  
  55.         if (!mediaPlayer.isPlaying()) {  
  56.             mediaPlayer.start();  
  57.         }  
  58.     }  
  59.   
  60.     public void pause() {  
  61.         if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
  62.             mediaPlayer.pause();  
  63.         }  
  64.     }  
  65.   
  66.     public void stop() {  
  67.         if (mediaPlayer != null) {  
  68.             mediaPlayer.stop();  
  69.             try {  
  70.                 mediaPlayer.prepare();  // 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数  
  71.             } catch (IOException ex) {  
  72.                 ex.printStackTrace();  
  73.             }  
  74.         }  
  75.     }  
  76. }  

AndroidManifest.xml

注册activity

[css]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
  1. <activity  
  2.     android:name=".service.PlayMusicService"  
  3.     android:label="@string/app_name" />  

注册service

[css]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
  1. <service  
  2.     android:name=".service.MusicService"  
  3.     android:enabled="true" >  
  4.     <intent-filter>  
  5.         <action android:name="com.homer.service.musicService" />  
  6.     </intent-filter>  
  7. </service>  

2.Context.bindService()方式启动:

[java]  view plain  copy
  1. package com.dada.test;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.ComponentName;  
  5. import android.content.Context;  
  6. import android.content.Intent;  
  7. import android.content.ServiceConnection;  
  8. import android.os.Bundle;  
  9. import android.os.IBinder;  
  10. import android.util.Log;  
  11. import android.view.View;  
  12. import android.widget.Button;  
  13.   
  14. import com.dada.test.BindService.MyBinder;  
  15.   
  16. public class TestActivity extends Activity {  
  17.       
  18.     private boolean flag;  
  19.     private static final String TAG = "TestActivity";  
  20.     /** Called when the activity is first created. */  
  21.     @Override  
  22.     public void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         setContentView(R.layout.main);  
  25.           
  26.         super.onCreate(savedInstanceState);   
  27.         setContentView(R.layout.main);   
  28.    
  29.         Button btnStart = (Button) findViewById(R.id.btnStart);   
  30.    
  31.         Button btnStop = (Button) findViewById(R.id.btnStop);   
  32.    
  33.           
  34.         btnStart.setOnClickListener(new View.OnClickListener() {   
  35.             @Override   
  36.             public void onClick(View v) {   
  37.                 //启动service 方式2  
  38.                 bindService();  
  39.             }   
  40.         });   
  41.           
  42.         btnStop.setOnClickListener(new View.OnClickListener() {   
  43.                
  44.             @Override   
  45.             public void onClick(View v) {   
  46.  //停止service 方式2  
  47.                 unBindService();  
  48.             }   
  49.         });   
  50.     }  
  51.       
  52.     //启动service 方式2  
  53.     //  
  54.     private void bindService(){  
  55.         Intent intent = new Intent(TestActivity.this,BindService.class);  
  56.         Log.i(TAG, "bindService()");  
  57.         bindService(intent, conn, Context.BIND_AUTO_CREATE);  //在activity 绑定服务
  58.     }  
  59.       
  60.     private void unBindService(){  
  61.         Log.i(TAG, "unBindService() start....");  
  62.         if(flag == true){  
  63.             Log.i(TAG, "unBindService() flag");  
  64.             unbindService(conn);  
  65.             flag = false;  
  66.         }  
  67.     }  
  68.       
  69. private ServiceConnection conn = new ServiceConnection() {  
  70.           
  71.         @Override  
  72.         public void onServiceDisconnected(ComponentName name) {  
  73.             // TODO Auto-generated method stub  
  74.             Log.i(TAG, "onServiceDisconnected()");  
  75.         }  
  76.           
  77.         @Override  
  78.         public void onServiceConnected(ComponentName name, IBinder service) {  
  79.             // 在服务成功绑定的回调方法onServiceConnected, 会传递过来一个 IBinder对象service
  80.             Log.i(TAG, "onServiceConnected()"); 
  81.             /*通过向下转型得到了 MyBinder 的实例,有了这个实例,活动和服务之间的关系就变得非常紧密了*/ 
  82.             MyBinder binder = (MyBinder)service;  
  83.             /*强制类型转化为自定义的接口类型MyBinder,调用接口里面的方法。*/ 
  84.             BindService bindService = binder.getService1(); 
  85.             bindService.MyMethod();  
  86.             flag = true;  
  87. /*上面这段就实现了活动绑定并启动服务,服务通过其自建内部类MyBinder来调用服务的方法。
  88. activity->bindService方法-》服务的onBind方法(返回自建内部类MyBinder实例)-》ServiceConnection.onServiceConnected()-》通过MyBinder实例 调用服务方法, 现在我们可以在活动中根据具体的场景来调用MyBinder中的任何 public 方法,即实现了指挥服务干什么,服务就去干什么的功能。*/
  89.         }  
  90.     };  
  91. }  

9.3.3 活动和服务进行通信

绑定本地服务调用方法的步骤:

在服务的内部创建一个内部binder类 并提供一个方法,可以间接调用服务的方法
实现服务的onbind方法,返回的就是这个内部binder类
在activity 绑定服务。bindService();
在服务成功绑定的回调方法onServiceConnected, 会传递过来一个 IBinder对象
强制类型转化为自定义的接口类型binder类,调用接口里面的方法。

service

[java]  view plain  copy
  1. package com.dada.test;  
  2.   
  3. import android.app.Service;  
  4. import android.content.Intent;  
  5. import android.os.Binder;  
  6. import android.os.IBinder;  
  7. import android.util.Log;  
  8.   
  9. public class BindService extends Service {  
  10.   
  11.     private static final String TAG = "BindService";  
  12.     private MyBinder myBinder = new MyBinder();  
  13.     public void MyMethod(){  
  14.         Log.i(TAG, "BindService-->MyMethod()");  
  15.     }  
  16.       
  17.     @Override  
  18.     public IBinder onBind(Intent intent) {  
  19.         Log.i(TAG, "BindService-->onBind()");  
  20.         return myBinder;  
  21.     }  
  22.       
  23.   //在服务的内部创建一个内部类MyBinder 提供一个方法getService1(),可以间接调用服务的方法MyMethod() 
  24.     public class MyBinder extends Binder{
  25.           
  26.         public BindService getService1(){  
  27.             return BindService.this;  
  28.         }  
  29.     }  
  30.       
  31.     
  32.   
  33.     @Override  
  34.     public void onCreate() {  
  35.         Log.i(TAG, "BindService-->onCreate()");  
  36.         super.onCreate();  
  37.     }  
  38.   
  39.     @Override  
  40.     public void onStart(Intent intent, int startId) {  
  41.         Log.i(TAG, "BindService-->onStart()");  
  42.         super.onStart(intent, startId);  
  43.     }  
  44.   
  45.     @Override  
  46.     public void onDestroy() {  
  47.         Log.i(TAG, "BindService-->onDestroy()");  
  48.         super.onDestroy();  
  49.     }  
  50.   
  51.     @Override  
  52.     public boolean onUnbind(Intent intent) {  
  53.         Log.i(TAG, "BindService-->onUnbind()");  
  54.         return super.onUnbind(intent);  
  55.     }  
  56.       
  57. }  

运行日志

点击启动


点击停止


没有打出onServiceDisconnected的日志的原因:

注:SDK上是这么说的:This is called when the connection with the service has been 
unexpectedly disconnected -- that is, its process crashed. Because it is running in our same 
process, we should never see this happen.

所以说,只有在service因异常而断开连接的时候,这个方法才会用到

其他

由于Service 的onStart()方法只有在startService()启动Service的情况下才调用,故使用onStart()的时候要注意这点。

与 Service 通信并且让它持续运行

      如果我们想保持和 Service 的通信,又不想让 Service 随着 Activity 退出而退出呢?你可以先 startService() 然后再 bindService() 。当你不需要绑定的时候就执行 unbindService() 方法,执行这个方法只会触发 Service 的 onUnbind() 而不会把这个 Service 销毁。这样就可以既保持和 Service 的通信,也不会随着 Activity 销毁而销毁了。


另外需要注意,任何一个服务在整个应用程序范围内都是通用的,即 Service 不仅可以和 MainActivity 绑定,还可以和任何一个其他的活动进行绑定,而且在绑定完成后它们都可以获取到相同的 Binder 实例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Service两种启动方式 的相关文章

  • 大雨

    大雨生彷徨 以为天人兮溯鎏妆 轰鸣兮悠远 望长水东来去也 长生共兴
  • 汇率之谜:揭秘黄金折算与真实人民币汇率的神秘差距

    导言 人民币是中国的官方货币 其汇率在国际贸易和金融市场中扮演着至关重要的角色 然而 观察到黄金折算的人民币汇率与真实人民币汇率之间存在显著差距 本文将探讨这一差距的原因以及它所暗示的经济现象 汇率基础知识 首先 让我们了解一下汇率的基础知
  • 用Python让奇怪的想法变成现实,2023年继续创作

    2023年继续写作 用文章记录生活 时间过得真快 一下就到2023年了 由于疫情肆虐 在网络的游弋的实现也长了 写作的自然也多了 回想一下 2018 2021年这三年时间里一篇文章也没写过为0 哈哈 没错 为0 这段时间总是忙于自己的工作
  • 如何利用Requestly提升前端开发与测试的效率

    前端测试 在进行前端页面开发或者测试的时候 我们会遇到这一类场景 在开发阶段 前端想通过调用真实的接口返回响应 在开发或者生产阶段需要验证前端页面的一些 异常场景 或者 临界值 时 在测试阶段 想直接通过修改接口响应来验证前端页面是否正常
  • 测试人员如何管理项目与风险预警

    在平时工作过程中 你有没有因项目延时 需求频繁变更 开发提测质量不高 以及漏测的情况下 背了不少锅的情况呢 作为测试人员 我们应该如何发挥积极主动性 进行项目管理 有效的控制项目流程 在项目流程推过过程中 如果出现有风险 如何进行高效及时的
  • 软件测试要学习的基础知识——黑盒测试

    黑盒测试概述 黑盒测试 也叫功能测试 通过测试来检测每个功能是否都能正常使用 在测试中 把程序看作是一个不能打开的黑盒子 在完全不考虑程序内部结构和内部特性的情况下 对程序接口进行测试 只检查程序功能是否按照需求规格说明书的规定正常使用 程
  • 接口测试的简介及测试用例的设计

    一 什么是接口 接口测试 是测试系统组件间接口的一种测试 接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点 测试的重点是要检查数据的交换 传递和控制管理过程 以及系统间的相互逻辑依赖关系等 二 接口的作用 作为一个互联网
  • redis性能测试

    redis性能测试 redis提供了一个性能测试工具redis benchmark 可以使用redis benchmark命令来了解redis的性能 redis benchmark q c 50 q 表示简化输出结果 c 50 表示有五十个
  • 现在的00后,实在是太卷了......

    现在的小年轻真的卷得过分了 前段时间我们公司来了个00年的 工作没两年 跳槽到我们公司起薪18K 都快接近我了 后来才知道人家是个卷王 从早干到晚就差搬张床到工位睡觉了 最近和他聊了一次天 原来这位小老弟家里条件不太好 一大家子指望他一个人
  • 浅谈Django之单元测试

    一 什么是 单元测试 单元测试 是用来对一个模块 一个函数或者一个类来进行正确性检验的测试工作 如果测试通过则说明我们这个函数或功能能够正常工作 如果失败要么 测试用例 不正确 要么函数有bug需要修复 二 如何使用单元测试 from dj
  • 银行测试要求高吗?从业人员来为你解答!

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 5k次 点赞69次 收藏10次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 职场经验|你在和谁竞争?

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 5k次 点赞69次 收藏10次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 程序员的养生之道

    程序员的养生之道 1 对程序员的初次印象 2 我的养生之道 2 1 规律作息 2 2 合理饮食 2 3 健康饮食 2 4 增强锻炼 2 5 心态平和 2 6 生活习惯
  • 从一个程序员的角度看东方甄选“小作文”事件

    最近东方甄选 小作文 风波愈演愈烈 开始小编和观众吵架 后面东方小孙本来想要平息风波 而 摔手机 和泄漏董宇辉薪资待遇有激起更大的风波 导致东方甄选粉丝每天都几万 几十万的下降 作为一个消费者 开始是不太能理解东方甄选的这些骚操作 东方甄选
  • 从一个程序员的角度看东方甄选“小作文”事件

    最近东方甄选 小作文 风波愈演愈烈 开始小编和观众吵架 后面东方小孙本来想要平息风波 而 摔手机 和泄漏董宇辉薪资待遇有激起更大的风波 导致东方甄选粉丝每天都几万 几十万的下降 作为一个消费者 开始是不太能理解东方甄选的这些骚操作 东方甄选
  • 石头纪 Stone Story RPG免安装中文版

    石头纪 Stone Story RPG 从众多优秀的游戏作品中汲取灵感 并且利用独特的ASCII艺术动画 结合放置挂机玩法 RPG 机制 可编程要素等诸多内容 打造出完全独特的游戏体验 在 石头纪 中 玩家无法直接操控游戏角色本身 AI会自
  • 恐怖单机游戏:坤坤之夜 KUNKUNNIGHT 中文免安装版

    坤坤之夜 是一款结合了恐怖和恶搞元素的独立游戏 开发时长约为两年半 游戏以第一人称视角展开 讲述了一个虚构的恐怖故事 在游戏中 玩家将与一个名叫坤坤的男子进行一场惊心动魄的逃生经历 游戏特点 恐怖与恶搞元素 游戏在恐怖氛围的营造上十分用心
  • 恐怖单机游戏:坤坤之夜 KUNKUNNIGHT 中文免安装版

    坤坤之夜 是一款结合了恐怖和恶搞元素的独立游戏 开发时长约为两年半 游戏以第一人称视角展开 讲述了一个虚构的恐怖故事 在游戏中 玩家将与一个名叫坤坤的男子进行一场惊心动魄的逃生经历 游戏特点 恐怖与恶搞元素 游戏在恐怖氛围的营造上十分用心
  • MySQL忘记密码了怎么办

    MySQL忘记密码 今天在写jdbc时很悲催的发现自己的MySQL密码忘记了 没有办法了 重新设置一下密码吧 先关闭mysql服务mysql server stop 跳过权限检验 在使用该命令的时候要确保mysql服务是关闭的 不然是无法正
  • Docker 安全必知:最佳实践、漏洞管理与监控策略

    容器安全是实施和管理像 Docker 这样的容器技术的关键方面 它包括一组实践 工具和技术 旨在保护容器化应用程序及其运行的基础架构 在本节中 我们将讨论一些关键的容器安全考虑因素 最佳实践和建议 容器隔离 隔离对于确保容器化环境的强大性和

随机推荐

  • 3D游戏编程作业四

    基本操作演练 首先是去unity商店下载一个skybox的资源包 然后创建一个materia 点击shader选择skybox并选择6sided 然后将相应位置的图片拖进去 点击add component 选择rendering 添加sky
  • VSCODE同步插件以及代码片段

    利用 share code 插件同步代码片段 利用 Settings Sync可以同步 VS code 配置 但它只能同步插件 利用 Settings Sync 再配合 share code 插件可以同步自定义代码片段 可以把 VS cod
  • BatchConfigTool批量配置工具

    海康批量配置工具BatchConfigTool是一款支持设备在线搜索 批量配置参数 批量升级等功能的软件 支持对大批量设备同时进行各参数的配置 极大的简化了操作过程 软件功能 1 对在线设备进行搜索 激活 修改设备的网络参数等 2 批量对设
  • hadoop 运行java 清洗数据 报错Failed to set permissions of path: \tmp\...

    清洗数据写好代码后 运行报错 ERROR org apache hadoop mapred TaskTracker Can not start task tracker because java io IOException Failed
  • 转载的关于 二级制的反码,补码,原码等,筛选过的.

    一 机器数和真值 在学习原码 反码和补码之前 需要先了解机器数和真值的概念 1 机器数 一个数在计算机中的二进制表示形式 叫做这个数的机器数 机器数是带符号的 在计算机用一个数的最高位存放符号 正数为0 负数为1 比如 十进制中的数 3 计
  • 关系数据库范式(1NF,2NF,3NF,BCNF,4NF,5NF)全解析

    1 范式的基本概念 设计关系数据库时 遵从不同的规范要求 设计出合理的关系型数据库 这些不同的规范要求被称为不同的范式 各种范式呈递次规范 越高的范式数据库冗余越小 没有冗余的数据库未必是最好的数据库 有时为了提高运行效率 就必须降低范式标
  • 【VHDL】分频器设计要求:25分频,占空比为50%

    VHDL 分频器设计要求 25分频 占空比为50 程序 LIBRARY IEEE USE IEEE STD LOGIC 1164 all entity DIV 25 IS PORT CLK IN STD LOGIC S1 S2 BUFFER
  • java引入包的关键字_java 包和导包关键字import

    包的概念 相当于 文件夹 person java package com jd public class person 注意该处为public 这样才能被访问 String name int age public person String
  • 用代码生成Glitch Art风格的抖音字体

    最近看到不少文章教大家用 photoshop 实现抖音的 logo 跟字体 我也非常喜欢这种风格的字体 于是趁着晚上的时间 动手用代码实现了下此类风格的字体特效 顺便开发了个小工具 地址见文末 本文主要是从 艺术手法 和 JS 前端 实现
  • UVA1347 Tour

    2021 5 22 刷题的时候突然看到手机推送 袁隆平院士逝世 心中一颤 后来得到辟谣 心情稍微放松几分 正在刷着辟谣的文章时 央视新闻发文 13点07分 袁隆平院士逝世 没过多久又看到吴孟超院士逝世的新闻 心情难以平复 特在本文的开头 向
  • 【华为OD机试】求满足条件的最长子串的长度(C++ Python Java)2023 B卷

    题目描述 给定一个字符串 只包含字母和数字 按要求找出字符串中的最长 连续 子串的长度 字符串本身是其最长的子串 子串要求 1 只包含1个字母 a z A Z 其余必须是数字 2 字母可以在子串中的任意位置 如果找不到满足要求的子串 如全是
  • 力扣17电话号码的字母组合(c++)

    力扣17电话号码的字母组合 c 力扣题目链接 思路 阅读完本题题目要求后 要解决如下3个问题 1 数字和字母如何映射 2 两个字母就两个for循环 三个字符我就三个for循环 以此类推 然后发现代码根本写不出来 3 输入1 按键等等异常情况
  • 从零开始搭建kafka开发环境

    Part1前言 最近选用kafka作为消息缓存 来低于大流量的数据 Kafka是一种高吞吐量的分布式发布订阅消息系统 有如下特性 通过O 1 的磁盘数据结构提供消息的持久化 这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能 高吞
  • 16位片内地址的I2C SLAVE接口设计

    8位片内地址的I2C SLAVE在OPENCORS org上面有 但是我没有找到16位的 我打算用B210的接EEPROM的I2C总线实现跟FPGA通讯就对照24C256的数据手册写了一个 以下代码2022 6 6更新已经实际运行通过 i2
  • YOLOv5——报错解决:UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xb2 in position 6:invalidstartbyte

    在提示报错的torch utils py文件58行 将原来的decode 改成decode encoding gbk
  • 一文读懂伪回归、协整、格兰杰

    一 什么叫做伪回归 若是所建立的回归模型在经济意义上没有因果关系 那么这个就是伪回归 例如路边小树年增长率和国民经济年增长率之间存在很大的相关系数 但是建立的模型却是伪回归 如果你直接用数据回归 那肯定存在正相关 而其实这个是没有意义的回归
  • 【AI实战】最强开源 6B 中文大语言模型ChatGLM2-6B,从零开始搭建

    AI实战 最强开源 6B 中英文大语言模型ChatGLM2 6B 从零开始搭建 ChatGLM2 6B 简介 ChatGLM2 6B 评测结果 ChatGLM2 6B 搭建 参考 ChatGLM2 6B 简介 ChatGLM2 6B 是开源
  • 区块链相关概念与简介

    摘要 2017 2018年 互联网界最火热的话题之一就是区块链 各大公司相继宣布对区块链方面的投资和开发 各大互联网公司也前后推出自己区块链产品 例如阿里的麻吉宝 百度的莱次狗 腾讯的TrustSQL等等 那么区块链到底是什么 本文简单介绍
  • strace 命令来查看系统调用

    strace p pid strace p pid i i 显示函数地址
  • Android Service两种启动方式

    1 Context startService 方式启动 Context startService 方式的生命周期 启动时 startService gt onCreate gt onStart 可多次调用 Service running 停