(3) 当Activity销毁的时候服务也销毁,不求同时生但求同时死
(4) 通过bind方法开启服务,服务不能在设置页面里面找到,相当于一个隐形的服务(高大上)
(5) bindService不能多次解绑,多次解绑会报错
6. 可以使用Service开启特殊的广播接收者
=========================
1.比如屏幕的解锁 这种广播不能在清单文件中注册,注册了也没用,需要在代码中动态的注册. 这时候可以使用服务注册,
注册之后,即使Activity被onDestroy()服务依然在,广播依然可以监听到屏幕的状态.
7. bindService方式调用服务里面方法的过程
============================
- 定义一个服务,继承自Service,需要在清单文件中注册.服务里面有一个方法需要Activity去调用.
//测试方法
public void banzheng(int money){
if(money > 100){
Toast.makeText(getApplicationContext(), “我是领导,把证给你办了”, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), “就这点儿钱,还想办事”, Toast.LENGTH_SHORT).show();
}
}
- 定义一个中间人对象(MyBinder)继承自Binder
public class MyBinder extends Binder{
//2.定义一个方法 调用上面的测试方法
public void callbanzheng(int money){
banzheng(money);
}
}
- 在服务里面的onBind()方法里面,把我们定义的中间人对象(MyBinder)返回
public IBinder onBind(Intent intent) {
//3.把定义的中间人对象返回
return new MyBinder();
}
- 在Activity的onCreate()方法里面调用bindService()绑定服务,需要一个类继承自ServiceConnection来监听服务的状态,监听的时候可以拿到服务通过onBind()方法返回的Binder对象. (记得在Activity的onDestroy()方法中unbindService()解除绑定)
//开启服务
Intent intent = new Intent(this,TestService.class);
//连接服务 TestService
myConn = new MyConn();
//绑定服务
bindService(intent, myConn, BIND_AUTO_CREATE);
//监视服务的状态
class MyConn implements ServiceConnection{
//当连接服务成功后
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
[4]获取我们定义的中间人对象
myBinder = (MyBinder) service;
}
//失去连接
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
- 拿到中间人(服务通过onBind()方法返回的Binder对象),就可以间接的调用服务里面的方法了.
@Override
public void onClick(View v) {
//通过我们定义的中间人对象 间接调用服务里面的方法
myBinder.callbanzheng(1002);
}
8. 通过接口方式调用服务里面的方法
===================
接口可以隐藏代码内部的细节,让程序员暴露自己只想暴露的方法
-
定义一个接口把想暴露的方法都定义在接口里面
-
定义的中间人对象,实现定义的接口
private class MyBinder extends Binder implements IService{
//2.定义一个方法 调用上面的测试方法
public void callbanzheng(int money){
banzheng(money);
}
public void callDaMaJiang(){
daMaJiang();
}
public void callXiSangNa(){
xiSangNa();
}
}
- 再获取我们定义的中间人对象方式变量
//当连接服务成功后
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//[4]获取我们定义的中间人对象
myBinder = (Iservice) service;
}
9. 混合方式 开启服务
=============
需求:既想让服务在后台长期运行,也想调服务里面的方法.(eg:网易云音乐,在后台能播放音乐,应该是用服务实现的,然后也能在后台切换上一曲下一曲,应该也能调用服务里面的方法). 这时候需要混合方式开启服务
-
先调用startService()方法,保证服务在后台长期运行.
-
调用bindService()目的获取我们定义的中间人对象(写一个内部类继承Binder,通过onBind()方法返回),调用服务里面的方法.
-
unbindService()
-
最后调用stopService()停止服务
10. aidl介绍
===========
1.远程服务,运行在其他应用里面的服务
2.本地服务,运行在自己应用里面的服务
3.进行进程间通信 IPC
4.aidl Android interface Defination Language Android接口定义语言,专门用来解决,进程间通信的.
aidl 实现步骤和之前调用服务里面的方法的区别
-
先把Iservice.java文件后缀改成aidl文件
-
aidl不认识public,把这个文件里面的public关键字去掉
-
会自动生成一个Stub类,实现IPC(进程间通信)
-
我们定义的中间人对象(Service里面)直接继承自Stub
-
想要保证2个应用程序的aidl文件是同一个,要求aidl所在包名要相同.(把另外一个应用里面的aidl文件复制一份到自己的应用中,放到和另一个应用的相同的包名下面.)
-
获取中间人对象,Stub.asinterface(IBinder obj);这是静态方法,在监听服务的状态类实现ServiceConnection时,onServiceConnected()可以用得到.
aidl的应用场景
支付宝 非常有名 支付的方法
11. Activity与Service进行通信
=========================
- 首先在Service里面新建一个类继承自Binder,
private DownloadBinder mBinder = new DownloadBinder();
class DownloadBinder extends Binder{
/**
* 模拟的下载资源的方法
*/
public void startDownload(){
Log.i(TAG, “startDownload: executed”);
}
/**
-
模拟的下载资源时的获取下载进度的方法
-
@return
*/
public int getProgress(){
Log.i(TAG, “getProgress: executed”);
return 0;
}
}
-
然后重写Service类里面的onBind()方法,返回创建出来的DownloadBinder对象
-
在Activity中新建一个服务里面Binder类的实例.
private MyService.DownloadBinder downloadBinder;
/**
- 监听服务的连接状态
*/
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i(TAG, “onServiceConnected: 连接上服务”);
//成功绑定服务时调用
downloadBinder = (MyService.DownloadBinder)service;
downloadBinder.startDownload();
downloadBinder.getProgress();
}
@Override
public void onServiceDisconnected(ComponentName name) {
//断开连接
Log.i(TAG, “onServiceDisconnected: 断开连接”);
}
};
- 绑定服务
//绑定服务
//参数:Intent,ServiceConnection实例,flag 这里是BIND_AUTO_CREATE表示绑定后自动创建服务
bindService(intent,connection,BIND_AUTO_CREATE);
- 解绑服务
unbindService(connection);
12. 使用 前台进程
============
服务的系统优先级还是比较低的,当系统出现内存不足的情况时,就有可能会回收掉正在后台运行的服务.如果你希望服务可以一直保持运行的状态,而不会由于系统内存不足的原因导致被回收,就可以考虑使用前台进程.
前台服务和普通服务的罪的的区别就在于,它会一直有一个正在运行的图标在系统的状态栏显示.
@Override
public void onCreate() {
super.onCreate();
//设置当前Service为前台服务
Intent intent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this,0,intent,0);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle(“This is content title”) //设置标题
.setContentText(“this is content text”) //设置内容
.setWhen(System.currentTimeMillis()) //设置时间
.setSmallIcon(R.mipmap.ic_launcher) //设置状态栏小图标
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher)) //大图标
.setContentIntent(pendingIntent) //设置点击时跳转事件
.build(); //创建
startForeground(1,notification); //开始前台服务 让MyService变成一个前台服务,并在状态栏显示出来
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
架构师筑基包括哪些内容
我花了将近半个月时间将:深入 Java 泛型.、注解深入浅出、并发编程.、数据传输与序列化、Java 虚拟机原理、反射与类加载、高效 IO、Kotlin项目实战等等Android架构师筑基必备技能整合成了一套系统知识笔记PDF,相信看完这份文档,你将会对这些Android架构师筑基必备技能有着更深入、更系统的理解。
由于文档内容过多,为了避免影响到大家的阅读体验,在此只以截图展示部分内容
注:资料与上面思维导图一起看会更容易学习哦!每个点每个细节分支,都有对应的目录内容与知识点!
这份资料就包含了所有Android初级架构师所需的所有知识!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
获取!!(备注:Android)**
[外链图片转存中…(img-JZAbsve5-1713837708949)]
架构师筑基包括哪些内容
我花了将近半个月时间将:深入 Java 泛型.、注解深入浅出、并发编程.、数据传输与序列化、Java 虚拟机原理、反射与类加载、高效 IO、Kotlin项目实战等等Android架构师筑基必备技能整合成了一套系统知识笔记PDF,相信看完这份文档,你将会对这些Android架构师筑基必备技能有着更深入、更系统的理解。
由于文档内容过多,为了避免影响到大家的阅读体验,在此只以截图展示部分内容
注:资料与上面思维导图一起看会更容易学习哦!每个点每个细节分支,都有对应的目录内容与知识点!
[外链图片转存中…(img-fSI9CeyF-1713837708950)]
[外链图片转存中…(img-Kw65xjzu-1713837708951)]
这份资料就包含了所有Android初级架构师所需的所有知识!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!