Android 面试题之Service干货篇(1),字节跳动面试官工资

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

final Intent intentStart = new Intent(ServiceActivity.this, StartService.class);

startService(intentStart);

在上面的代码中,Intent指明了启动的Service所在类为StartService。

「通过该方式启动Service,访问者与Service之间没有关联,即使访问者退出了,Service也仍然运行。」

  • 2.停止service

显式启动停止Service,需要将启动Service的Intent传递给stopService (Intent)函数,代码如下:

stopService(intentStart);

「因Android5.0开始,Google要求必须使用显示Intent启动Service,所以隐式启动咱就不介绍了。」

bindService

  • 1.使用bindService()方法启动Service

绑定模式使用bindService()方法启动Service,其格式如下:

bindService(Intent service,ServiceConnection conn,int flags);

其中的参数说明如下:

  • service:该参数通过Intent指定需要启动的service。

  • conn:该参数是ServiceConnnection对象,当绑定成功后,系统将调用serviceConnnection的onServiceConnected ()方法,当绑定意外断开后,系统将调用ServiceConnnection中的onServiceDisconnected方法。

  • flags:该参数指定绑定时是否自动创建Service。如果指定为BIND_AUTO_CREATE,则自动创建,指定为0,则不自动创建。

绑定方式中,当调用者通过bindService()函数绑定Service时,onCreate()函数和onBinde ( )函数将被先后调用。

「通过该方式启动Service,访问者与Service绑定在一起,访问者一旦退出了,Service也就终止了。」

  • 2.使用unbindService()方法取消绑定

取消绑定仅需要使用unbindService()方法,并将ServiceConnnection传递给unbindService()方法。

但需要注意的是,unbindService()方法成功后,系统并不会调用onServiceConnected(),因为onServiceConnected()仅在意外断开绑定时才被调用。

当调用者通过unbindService()函数取消绑定Service时,onUnbind()函数将被调用。如果onUnbind()函数返回true,则表示重新绑定服务时,onRebind ()函数将被调用。

startService样例

  • 1.创建StartService.java继承自Service类,重写onCreate()方法、onStartCommand()方法、onBind()方法、onDestroy()方法,其代码如下:

public class StartService extends Service {

@Override

public void onCreate() {

super.onCreate();

MLog.e(getClass().getName(), “onCreate”);

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

MLog.e(getClass().getName(), “onStartCommand”);

return super.onStartCommand(intent, flags, startId);

}

@Override

public void onDestroy() {

MLog.e(getClass().getName(), “onDestroy”);

super.onDestroy();

}

@Nullable

@Override

public IBinder onBind(Intent intent) {

return null;

}

}

  • 2.创建ServiceActivity.java和配套的activity_service.xml文件,其代码如下:

public class ServiceActivity extends ActivityBase {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_service);

Intent intentStart = new Intent(ServiceActivity.this, StartService.class);

findViewById(R.id.btn_start).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

startService(intentStart);

}

});

findViewById(R.id.btn_stop).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

stopService(intentStart);

}

});

}

}

  • 配套的activity_service.xml文件
<?xml version="1.0" encoding="utf-8"?>

<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_start”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:text=“start启动服务”/>

<Button

android:id=“@+id/btn_stop”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:text=“start停止服务”/>

  • 3.添加Service组件声明,在AndroidManifest.xml文件中声明一个Service组件,其代码如下:
<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android=“http://schemas.android.com/apk/res/android”

package=“com.scc.demo”>

<application

…>

<activity

…>

  • 运行结果

07-07 16:41:11.474 E/-SCC-: com.scc.demo.actvitiy.ServiceActivityonCreate

07-07 16:41:11.481 E/-SCC-: com.scc.demo.actvitiy.ServiceActivityonStart

07-07 16:41:11.482 E/-SCC-: com.scc.demo.actvitiy.ServiceActivityonResume

07-07 16:41:13.313 E/-SCC-com.scc.demo.service.StartService: onCreate

07-07 16:41:13.334 E/-SCC-com.scc.demo.service.StartService: onStartCommand

07-07 16:41:16.705 E/-SCC-com.scc.demo.service.StartService: onDestroy

bindService样例

  • 1.创建BindService.java继承自Service类,重写onCreate()方法、onBind()方法、onUnbind()方法、onDestroy()方法,实现本地通知栏显示,其代码如下:

public class BindService extends Service {

//声明IBinder接口的一个接口变量mBinder

public final IBinder mBinder = new LocalBinder();

private NotificationManager mNM;

private int NOTIFICATION = R.string.local_service_started;

//LocalBinder是继承Binder的一个内部类

public class LocalBinder extends Binder {

public BindService getService() {

return BindService.this;

}

}

@Override

public void onCreate() {

mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

MLog.e(getClass().getName(), “onCreate”);

showNotification();

}

@Override

public void onDestroy() {

MLog.e(getClass().getName(), “onDestroy”);

mNM.cancel(NOTIFICATION);

Toast.makeText(this, R.string.local_service_stopped, Toast.LENGTH_SHORT).show();

}

@Override

public IBinder onBind(Intent intent) {

MLog.e(getClass().getName(), “onBind”);

return mBinder;

}

@Override

public boolean onUnbind(Intent intent) {

MLog.e(getClass().getName(), “onUnbind”);

return super.onUnbind(intent);

}

private void showNotification() {

CharSequence text = getText(R.string.local_service_started);

PendingIntent contentIntent = PendingIntent.getActivity(this, 0,

new Intent(this, ServiceActivity.class), 0);

Notification notification = new Notification.Builder(this)

.setSmallIcon(R.mipmap.ic_launcher)

.setTicker(text)

.setWhen(System.currentTimeMillis())

.setContentTitle(getText(R.string.local_service_label))

.setContentText(text)

.setContentIntent(contentIntent)

.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文件
<?xml version="1.0" encoding="utf-8"?>

<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学习方向及思路(详细的内容太多了~),提供给大家:

对于程序员来说,要学习的知识内容、技术有太多太多,这里就先放上一部分,其他的内容有机会在后面的文章向大家呈现出来,不过我自己所有的学习资料都整理成了一个文档,一直在不断学习,希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!

Android架构师之路很漫长,一起共勉吧!

如果你觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

对于程序员来说,要学习的知识内容、技术有太多太多,这里就先放上一部分,其他的内容有机会在后面的文章向大家呈现出来,不过我自己所有的学习资料都整理成了一个文档,一直在不断学习,希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!

Android架构师之路很漫长,一起共勉吧!

如果你觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。

[外链图片转存中…(img-j5VZmjIZ-1713441287392)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-MPe1Ju8e-1713441287392)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值