.build();
mNM.notify(NOTIFICATION, notification);
MLog.e(getClass().getName(), “通知栏已出”);
}
}
- 2.创建ServiceActivity.java和配套的activity_service.xml文件,其代码如下:
public class ServiceActivity extends ActivityBase {
private BindService bindService;
private boolean isBind = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_service);
findViewById(R.id.btn_bind).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!isBind) {
Intent intentBind = new Intent(ServiceActivity.this, BindService.class);
bindService(intentBind, serviceConnection, Context.BIND_AUTO_CREATE);
isBind = true;
}
}
});
findViewById(R.id.btn_unbing).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isBind) {
isBind = false;
unbindService(serviceConnection);
bindService = null;
}
}
});
}
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MLog.e(getClass().getName(), “onServiceConnected”);
bindService = ((BindService.LocalBinder) service).getService();
}
@Override
public void onServiceDisconnected(ComponentName name) {
MLog.e(getClass().getName(), “onServiceDisconnected”);
bindService = null;
}
};
}
- 配套的activity_service.xml文件
<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
android:id=“@+id/ll_bg”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:orientation=“vertical”
android:background=“@color/color_666666”>
<Button
android:id=“@+id/btn_bind”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“bind服务绑定”/>
<Button
android:id=“@+id/btn_unbing”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“bind解除绑定”/>
- 3.添加Service组件声明,在AndroidManifest.xml文件中声明一个Service组件,其代码如下:
<manifest xmlns:android=“http://schemas.android.com/apk/res/android”
package=“com.scc.demo”>
<application
…>
<activity
…>
…
- 4运行结果
07-07 17:00:04.309 E/-SCC-: com.scc.demo.actvitiy.ServiceActivityonCreate
07-07 17:00:04.350 E/-SCC-: com.scc.demo.actvitiy.ServiceActivityonStart
07-07 17:00:04.350 E/-SCC-: com.scc.demo.actvitiy.ServiceActivityonResume
07-07 17:00:10.088 E/-SCC-com.scc.demo.service.BindService: onCreate
07-07 17:00:10.120 E/-SCC-com.scc.demo.service.BindService: 通知栏已出
07-07 17:00:10.145 E/-SCC-com.scc.demo.service.BindService: onBind
07-07 17:00:10.164 E/-SCC-com.scc.demo.actvitiy.ServiceActivity$5: onServiceConnected
07-07 17:00:39.111 E/-SCC-com.scc.demo.service.BindService: onUnbind
07-07 17:00:39.134 E/-SCC-com.scc.demo.service.BindService: onDestroy
三、Service生命周期
「onBind()」 是Service必须实现的方法,返回的IBinder对象相当于Service组件的代理对象,Service允许其他程序组件通过IBinder对象来访问Service内部数据,这样即可实现其他程序组件与Service之间的通信。
startService启动的生命周期
「onCreate()」 当Service第一次被创建时,由系统调用。
「onStartCommand()」 当startService方法启动Service时,该方法被调用。
「onDestroy()」 当Service不再使用时,由系统调用。
注意:一个startService只会创建一次,销毁一次,但可以开始多次,因此,onCreate()和onDestroy()方法只会被调用一次,而onStart()方法会被调用多次。
bindService启动的生命周期
「onCreate()」 当Service被创建时,由系统调用。
「onBind()」 当bindService方法启动Service时,该方法被调用。
「onUnbind()」 当unbindService方法解除绑定时,该方法被调用。
「onDestroy()」 当Service不再使用时,由系统调用。
注意:一个bindService可以创建多次,销毁多次,重复使用。
四、Service和Thread的区别
Service是安卓中系统的组件,它运行在独立进程的主线程中,不可以执行耗时操作。
Thread是程序执行的最小单元,分配CPU的基本单位,可以开启子线程执行耗时操作。
Service在不同Activity中可以获取自身实例,可以方便的对Service进行操作。
Thread在不同的Activity中难以获取自身实例,如果Activity被销毁,Thread实例就很难再获取得到。
五、使用IntentService
IntentService是 Scrvice 的子类,因此它不是普通的Service,它比普通的Service增加了额外的功能。
先看Service本身存在的两个问题。
-
Service不会专门启动一个单独的进程,Service与它所在应用位于同一个进程中。
-
Service不是一条新的线程,因此不应该在Service中直接处理耗时的任务。
IntentService正好弥补了Service的不足。
IntentService的特点:
-
IntentService会创建单独的worker线程来处理所有的Intent请求。
-
IntentService会创建单独的worker线程来处理onHandleIntent()方法实现的代码,因此开发者无须处理多线程问题。
IntentService实例
- 1.创建SccIntentService.java继承自IntentService类,重写onHandleIntent()方法、创建一个无参构造函数,其代码如下:
public class SccIntentService extends IntentService {
public SccIntentService() {
super(“SccIntentService”);
}
@Override
protected void onHandleIntent(Intent intent) {
MLog.e(getClass().getName(), “onHandleWork”);
for (int i = 0; i < 3; i++) {
try {
MLog.e(getClass().getName(), “Number:开始”+i);
Thread.sleep(10000);
MLog.e(getClass().getName(), “Number:结束”+i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
MLog.e(getClass().getName(), “onDestroy”);
}
}
- 2、添加IntentService组件声明,在AndroidManifest.xml文件中声明一个Service组件,其代码如下:
- 3、启动SccIntentService
startService(new Intent(ServiceActivity.this, SccIntentService.class));
- 4、运行结果
07-07 18:00:39.505 E/-SCC-: com.scc.demo.actvitiy.ServiceActivityonCreate
07-07 18:00:39.531 E/-SCC-: com.scc.demo.actvitiy.ServiceActivityonStart
07-07 18:00:39.531 E/-SCC-: com.scc.demo.actvitiy.ServiceActivityonResume
07-07 18:01:12.690 E/-SCC-com.scc.demo.service.SccIntentService: onHandleWork
07-07 18:01:12.690 E/-SCC-com.scc.demo.service.SccIntentService: Number:开始0
07-07 18:01:22.691 E/-SCC-com.scc.demo.service.SccIntentService: Number:结束0
07-07 18:01:22.697 E/-SCC-com.scc.demo.service.SccIntentService: Number:开始1
07-07 18:01:32.698 E/-SCC-com.scc.demo.service.SccIntentService: Number:结束1
07-07 18:01:32.698 E/-SCC-com.scc.demo.service.SccIntentService: Number:开始2
07-07 18:01:42.699 E/-SCC-com.scc.demo.service.SccIntentService: Number:结束2
07-07 18:01:42.716 E/-SCC-com.scc.demo.service.SccIntentService: onDestroy
普通Service直接执行20S的的耗时操作,会阻塞主线程,造成ANR(程序无响应)异常。
- IntentService执行30S的耗时操作,不会阻塞主线程,更不会产生ANR。如上图开始18:01:12>18:01:42长达30S,正常运行未产生ANR。
- IntentService还有个好处就是 「用完即走」。执行完onHandleIntent()方法里面的耗时操作后,自行调用onDestroy()方法,进行关闭。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
总结
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的14套腾讯、字节跳动、阿里、百度等2020面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的14套腾讯、字节跳动、阿里、百度等2020面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。
[外链图片转存中…(img-KXLFy5yr-1710770698306)]
[外链图片转存中…(img-VURXEDPS-1710770698307)]
[外链图片转存中…(img-p2JWpFNw-1710770698307)]
[外链图片转存中…(img-FtGuCkuL-1710770698307)]
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
[外链图片转存中…(img-maJg2ys8-1710770698308)]