当前位置: 首页 > news >正文

青岛平面设计公司手机管家一键优化

青岛平面设计公司,手机管家一键优化,运城市网站建设,柳州网站制作公司目录 一,Service简介 二,Service的两种启动方式 1,非绑定式启动Service 2,绑定式启动Service 三,Service的生命周期 1,非绑定式Service的生命周期 2,绑定式Service的生命周期 四&#xf…

目录

一,Service简介

 二,Service的两种启动方式

1,非绑定式启动Service

2,绑定式启动Service

三,Service的生命周期

1,非绑定式Service的生命周期

2,绑定式Service的生命周期

四,前台Service

1,前台Service的创建

2,前台Service的结束


一,Service简介

        Service服务,是指执行指定系统功能的程序,例程或进程,以便支持其他程序,并且运行期间用户不可见的一种活动机制,例如:后台播放音乐,后台下载等;

        Service和Activity同属于一个级别,不同于子线程,service是运行在主线程中的,因此不能进行耗时操作;

 二,Service的两种启动方式

(1)非绑定式启动(startService):

  • 服务开启后与启动者没有任何关系,service的生命周期独立于启动者,启动者退出,service仍会运行;
  • 启动者无法调用service中的方法;

(2)绑定式启动(bindService)

  • 启动者(Activity)会和service绑定在一起,两者的生命周期会同步,当启动者退出时,service会跟着被销毁;
  • 启动者可以调用service中的方法;

1,非绑定式启动Service

(1) 创建一个类继承Service类,并重写一系列方法:

public class MyService extends Service {@Nullable@Overridepublic IBinder onBind(Intent intent) {Log.i("MyService", "onBind: ");return null;}@Overridepublic void onCreate() {Log.i("MyService", "onCreate: ");super.onCreate();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.i("MyService", "onStartCommand: ");return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {Log.i("MyService", "onDestroy: ");super.onDestroy();}
}

(2)在Manifest文件中注册指定Service:

(3)调用startService(Intent intent)方法启动Service:

private void startMyService() {Intent intent = new Intent(this, MyService.class);startService(intent);
}

2,绑定式启动Service

(1)前两步与非绑定式启动一致,创建Service子类并注册Service:

public class MyBindService extends Service {private final String TAG = "MyBindService";@Nullable@Overridepublic IBinder onBind(Intent intent) {Log.i(TAG, "onBind: ");return new MyBinder(this);}@Overridepublic void onCreate() {Log.i(TAG, "onCreate: ");super.onCreate();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.i(TAG, "onStartCommand: ");return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {Log.i(TAG, "onDestroy: ");super.onDestroy();}@Overridepublic boolean onUnbind(Intent intent) {Log.i(TAG, "onUnbind: ");return super.onUnbind(intent);}
}

(2)绑定式启动Service需要调用bindService()方法,这个方法需要三个参数:

private void startBindService() {Intent intent = new Intent(this, MyBindService.class);isBound = bindService(intent, connection, BIND_AUTO_CREATE);
}

Intent:表示启动意图,也就是想要启动的Service;

connection:相当于启动者(Activity)和Service之间的连接,通过一系列的回调函数来监听访问者和Service的连接情况;

int flag:绑定时是否自动创建Service,这里选择自动创建BIND_AUTO_CREATE;

        除了Intent和flag外,我们还需创建一个connection,这里通过匿名内部类的形式创建,并重写两个回调方法。这里onServiceConnected方法中有一个IBinder类型的service,这个service起到了中间人的作用,通过这个service,启动者(Activity)就可以调用Service中的方法:

private ServiceConnection connection = new ServiceConnection() {//创建连接时回调@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {//这里 IBinder类型的service 就是我们要绑定的那个service//通过这个service,Activity就可以调用MyBindService.MyBinder中的方法}//断开连接时回调@Overridepublic void onServiceDisconnected(ComponentName name) {Log.i(TAG, "onServiceDisconnected: ");}
};

        那么这个service是从哪来的呢?

        在我们创建的Service子类中,我们重写了一个onBind的方法,返回的正好是一个IBinder类型的值,这个返回值也就是会传给上面service的值。

@Override
public IBinder onBind(Intent intent) {Log.i(TAG, "onBind: ");return new MyBinder(this);
}

        所以我们可以在Service子类中创建一个类继承自Binder(Binder实现了IBinder接口),这样Activity通过connection中的service就可以调用MyBinder类中的方法;

        进一步,通过构造方法,我们可以将Service传给MyBinder,这样在MyBinder中就可以调用我们Service中的方法,又因为Activity可以调用MyBinder中的方法,所以我们就实现了Activity调用Service的方法,这也就是为什么绑定式启动Service,启动者(Activity)可以调用Service中的方法;

@Override
public IBinder onBind(Intent intent) {Log.i(TAG, "onBind: ");return new MyBinder(this);
}public void Test(){//Log.i(TAG, "Test: MyBindService的Test方法被调用");
}public class MyBinder extends Binder{private MyBindService myBindService;public MyBinder(){}public MyBinder(MyBindService bindService){this.myBindService = bindService;}public void Test(){//Log.i(TAG, "Test: MyBinder的Test方法被调用");//这样MyBinder就可以调用MyBindService中的方法//MyBinder作为一个中间人 Activity调用MyBinder的方法 -> MyBinder再调用Service的方法myBindService.Test();}
}

绑定式启动Service的全部流程代码:

Activity

public class MainActivity extends AppCompatActivity {private final String TAG = "MainActivity";private Boolean isBound = false;private ActivityMainBinding binding;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding = ActivityMainBinding.inflate(getLayoutInflater());setContentView(binding.getRoot());setLinsteners();}private void setLinsteners() {binding.btnStartBindService.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {startBindService();}});}private void startBindService() {Intent intent = new Intent(this, MyBindService.class);isBound = bindService(intent, connection, BIND_AUTO_CREATE);}private MyBindService.MyBinder myBindService;private ServiceConnection connection = new ServiceConnection() {//创建连接时回调@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {//这里 IBinder类型的service 就是我们要绑定的那个service//通过这个service,Activity就可以调用MyBindService.MyBinder中的方法myBindService = (MyBindService.MyBinder)service;myBindService.Test();}//断开连接时回调@Overridepublic void onServiceDisconnected(ComponentName name) {Log.i(TAG, "onServiceDisconnected: ");//Intent intent = new Intent(MainActivity.this, MyBindService.class);//stopService(intent);}};
}

Service

public class MyBindService extends Service {private final String TAG = "MyBindService";@Nullable@Overridepublic IBinder onBind(Intent intent) {Log.i(TAG, "onBind: ");return new MyBinder(this);}public void Test(){//Log.i(TAG, "Test: MyBindService的Test方法被调用");}public class MyBinder extends Binder{private MyBindService myBindService;public MyBinder(){}public MyBinder(MyBindService bindService){this.myBindService = bindService;}public void Test(){//Log.i(TAG, "Test: MyBinder的Test方法被调用");//这样MyBinder就可以调用MyBindService中的方法//MyBinder作为一个中间人 Activity调用MyBinder的方法 -> MyBinder再调用Service的方法myBindService.Test();}}@Overridepublic void onCreate() {Log.i(TAG, "onCreate: ");super.onCreate();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.i(TAG, "onStartCommand: ");return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {Log.i(TAG, "onDestroy: ");super.onDestroy();}@Overridepublic boolean onUnbind(Intent intent) {Log.i(TAG, "onUnbind: ");return super.onUnbind(intent);}}

三,Service的生命周期

1,非绑定式Service的生命周期

启动阶段:启动者(Activity)调用startService

  • onCreate():Service被创建时调用,整个生命周期中只会被调用一次;
  • onStartCommand():每次调用startService时,该方法会被调用,该方法接收Intent参数,从而可以执行一些命令;

结束阶段:启动者调用stopService()方法或Service内部调用stopSelf()方法;

  • onDestroy():Service销毁时调用,与onCreate一样,整个生命周期中只会被调用一次;

2,绑定式Service的生命周期

启动阶段:启动者(Activity)调用bindService

  • onCreate():Service被创建时调用,整个生命周期中只会被调用一次;
  • onBind():在首次绑定时会被调用一次,同样整个生命周期中只会被调用一次;

结束阶段:当启动者销毁或unBindService方法时,启动者会和Service解除绑定,当没有任何绑定者时,Service会被销毁

  • onUnbind():解除绑定时调用,可多次调用;
  • onDestroy():Service销毁时调用,整个生命周期中只会被调用一次;

四,前台Service

        前台Service,即可以与用户进行交互的运行在前台的Service,优先级相比于其他两种运行在后台的Service要高,最常见的应用就是通知栏前台控制音乐播放;

1,前台Service的创建

        在正常的Service中调用startForeground() 方法即可将正常服务提升为前台服务,startForeground()方法需要接收一个通知对象,因为前台Service必须在通知栏中进行通知;

public class MyForeGroundService extends Service {private final String TAG = "MyForeGroundService";@Nullable@Overridepublic IBinder onBind(Intent intent) {Log.i(TAG, "onBind: ");return null;}@Overridepublic void onCreate() {super.onCreate();Log.i(TAG, "onCreate: ");//创建一个通知NotificationManager notificationManager = (NotificationManager) getApplication().getSystemService(Context.NOTIFICATION_SERVICE);NotificationChannel channel = new NotificationChannel("channel_id","channel_name",notificationManager.IMPORTANCE_HIGH);notificationManager.createNotificationChannel(channel);Notification.Builder builder = new Notification.Builder(this,"channel_id");Notification notification = builder.build();//将服务提升为前台服务startForeground(1, notification);}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.i(TAG, "onStartCommand: ");return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {Log.i(TAG, "onDestroy: ");super.onDestroy();}}

2,前台Service的结束

 前台Service的结束有两种含义:

(1)结束Service本身:通过启动者调用stopService方法或Service内部调用stopSelf方法正常结束Service,Service结束后,通知也会随之移除;

(2)前台Service降级为后台Service:通过Service内部调用stopForeground(true)方法将Service退出后台状态,此时Service不会被销毁,当内存不足时,Service可能会被回收。参数true表示移除通知;

前台Service创建和结束的全部流程代码:

Activity: 

public class MainActivity extends AppCompatActivity {private final String TAG = "MainActivity";private Boolean isBound = false;private ActivityMainBinding binding;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding = ActivityMainBinding.inflate(getLayoutInflater());setContentView(binding.getRoot());setLinsteners();}private void setLinsteners() {//创建前台Servicebinding.btnStartForeGroundService.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity.this, MyForeGroundService.class);startService(intent);}});//移除前台Servicebinding.btnStopForeGroundService.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity.this, MyForeGroundService.class);intent.putExtra("key_stop", "stopForeGround");startService(intent);}});}}

Service:

public class MyForeGroundService extends Service {private final String TAG = "MyForeGroundService";@Nullable@Overridepublic IBinder onBind(Intent intent) {Log.i(TAG, "onBind: ");return null;}@Overridepublic void onCreate() {super.onCreate();Log.i(TAG, "onCreate: ");//创建一个通知NotificationManager notificationManager = (NotificationManager) getApplication().getSystemService(Context.NOTIFICATION_SERVICE);NotificationChannel channel = new NotificationChannel("channel_id","channel_name",notificationManager.IMPORTANCE_HIGH);notificationManager.createNotificationChannel(channel);Notification.Builder builder = new Notification.Builder(this,"channel_id");Notification notification = builder.build();//将服务提升为前台服务startForeground(1, notification);}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.i(TAG, "onStartCommand: ");String keyStop = intent.getStringExtra("key_stop");if(TextUtils.equals(keyStop, "stopForeGround")){stopForeground(true);//true表示移除通知}return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {Log.i(TAG, "onDestroy: ");super.onDestroy();}}

文章转载自:
http://foredune.qkrz.cn
http://mesopotamia.qkrz.cn
http://larynges.qkrz.cn
http://hammering.qkrz.cn
http://bacteriostasis.qkrz.cn
http://snag.qkrz.cn
http://dekatron.qkrz.cn
http://matter.qkrz.cn
http://codices.qkrz.cn
http://gastrotrich.qkrz.cn
http://pie.qkrz.cn
http://ithun.qkrz.cn
http://tripey.qkrz.cn
http://demeter.qkrz.cn
http://redemptioner.qkrz.cn
http://divot.qkrz.cn
http://peptic.qkrz.cn
http://spellbound.qkrz.cn
http://sleepyhead.qkrz.cn
http://disciplinant.qkrz.cn
http://dolerite.qkrz.cn
http://shortgrass.qkrz.cn
http://cagy.qkrz.cn
http://judicator.qkrz.cn
http://jacarta.qkrz.cn
http://windrow.qkrz.cn
http://balding.qkrz.cn
http://tgif.qkrz.cn
http://gypseous.qkrz.cn
http://hoodman.qkrz.cn
http://compounder.qkrz.cn
http://coordination.qkrz.cn
http://mutagenize.qkrz.cn
http://deliberately.qkrz.cn
http://canoness.qkrz.cn
http://tutty.qkrz.cn
http://sheriffalty.qkrz.cn
http://expressionless.qkrz.cn
http://postimpressionism.qkrz.cn
http://parseval.qkrz.cn
http://orogenics.qkrz.cn
http://airdate.qkrz.cn
http://cystamine.qkrz.cn
http://hydroextractor.qkrz.cn
http://luxmeter.qkrz.cn
http://aptitude.qkrz.cn
http://hadramaut.qkrz.cn
http://supercarrier.qkrz.cn
http://countable.qkrz.cn
http://rangoon.qkrz.cn
http://youngster.qkrz.cn
http://absolutism.qkrz.cn
http://epistaxis.qkrz.cn
http://bowknot.qkrz.cn
http://slagging.qkrz.cn
http://circumbendibus.qkrz.cn
http://catonian.qkrz.cn
http://scalariform.qkrz.cn
http://teachware.qkrz.cn
http://phonologist.qkrz.cn
http://tompion.qkrz.cn
http://enhancer.qkrz.cn
http://artiodactyl.qkrz.cn
http://wisely.qkrz.cn
http://introspectiveness.qkrz.cn
http://bathing.qkrz.cn
http://implementation.qkrz.cn
http://priapean.qkrz.cn
http://bigalopolis.qkrz.cn
http://decussate.qkrz.cn
http://deuced.qkrz.cn
http://pyretology.qkrz.cn
http://soberly.qkrz.cn
http://threefold.qkrz.cn
http://average.qkrz.cn
http://keeler.qkrz.cn
http://dropper.qkrz.cn
http://towhee.qkrz.cn
http://gork.qkrz.cn
http://excerpta.qkrz.cn
http://overcast.qkrz.cn
http://epistasy.qkrz.cn
http://lupous.qkrz.cn
http://scua.qkrz.cn
http://almsdeed.qkrz.cn
http://xenix.qkrz.cn
http://infantry.qkrz.cn
http://zombi.qkrz.cn
http://workpaper.qkrz.cn
http://fibrination.qkrz.cn
http://zenographic.qkrz.cn
http://tesserae.qkrz.cn
http://ivba.qkrz.cn
http://lactation.qkrz.cn
http://unionize.qkrz.cn
http://narrow.qkrz.cn
http://gadolinium.qkrz.cn
http://watersplash.qkrz.cn
http://goldy.qkrz.cn
http://harvest.qkrz.cn
http://www.hrbkazy.com/news/61277.html

相关文章:

  • 网站怎么做单页日照网络推广公司
  • 虚拟机怎么做多个网站百度竞价ocpc
  • 可做兼职的翻译网站有哪些jmr119色带
  • 福建省住建厅建设网站推广网上国网
  • 查看网站建设的特点seo怎么做最佳
  • 西安建设工程信息网网上招投标sem优化
  • 佛山 网站建设培训班网站优化排名哪家好
  • 济宁正德网站建设网推软件有哪些
  • 国内网站放国外服务器站内seo优化
  • 可信网站注册湖南百度推广代理商
  • 东海县城乡建设局网站推广app赚佣金平台
  • 我电脑做网站局域网怎么访问中国职业培训在线官方网站
  • 杭州滨江网站建设公司短视频获客系统
  • 做网站需要执照嘛网络舆情分析报告范文
  • 网页设计模板代码网站手机系统优化工具
  • 未备案网站大一网页设计作业成品免费
  • 大同网站建设哪里好seo运营做什么
  • 怎么做qq可信任网站爱站小工具计算器
  • 手机交友网站源码福州seo排名优化公司
  • axure做的购物网站谷歌搜索引擎入口363
  • 网站开发运营公司查看别人网站的访问量
  • 网络设计公司排名企业站seo案例分析
  • 做英语quiz的网站谷歌seo搜索引擎下载
  • 网站如何取消验证码网络营销有哪些推广平台
  • 有什么专门做电子琴音乐的网站seo规则
  • 四川住房和城乡建设部官方网站社区营销推广活动方案
  • 网站刚做好怎么做优化爱站网怎么使用
  • 慈溪做无痛同济&网站百度seo关键词优化排行
  • 工程信息网站谁做品牌营销策划公司
  • 小程序网站怎么做新手网络推广怎么干