VS/Xamarin Android开发Follow Me(五)

一、服务的生命周期

服务与活动一样,在它的整个生命周期中存在着一些事件,下图可以很好解释整个过程以及涉及到的方法:

在真实的使用中,Service来还包含一个OnBind方法,并且必须要使用该方法,但是只要返回NULL即可,除非当前服务是一个绑定服务,那么就要返回实现了IBinder的实例。

二、回调方法的总结

上图中涉及到了几个方法,下面将做简单的介绍:

OnCreate:只会在服务第一次开启的时候调用,主要负责一些初始化代码

OnStartCommand:每次启动服务都会调用该方法,可能来自StartService或者由系统重启。一般负责开启需要长时间的任务。并且该方法还要返回StartCommandResult类型的枚举,该返回值将影响系统重启该服务的细节。

OnDestroy:当服务使用StopSelf或者StopService时调用,主要用来释放资源等。

三、返回不同StartCommandResult服务的区别

Sticky:当服务由于内存不够被系统关闭后,将会由系统重启该服务,但是传入OnStartCommand方法的intent参数为NULL,意味着该类型的服务无法恢复上次的状态,只能进行常规的长时间任务。

RedeliverIntent:该类型的服务与Sticky的唯一的区别就是在系统重启该服务时,将会将上次关闭的服务的状态传递给OnStartCommand方法,用来恢复上次的任务继续执行。适合需要长时间连续的任务。

NotSticky:该服务被系统关闭后将不会重启。

StickyCompatibility:在API 5或以上的环境中的行为与Sticky一样,相反在API 5以下可能不会重启服务。

四、实现一个服务

这里我们需要继承自Service并还要需要加上Service注解属性(项目自行新建

1 namespace ServiceStudy
2 {
3     [Service]
4     public class MainService : Service
5     {
6
7     }
8 }

其中[Service]负责在AndroidManifest.xml注册服务,比如上面的服务将会生成如下字符串:

<service android:name="ServiceStudy.MainService"></service>

下面我们开始具体实现一个服务,上面已经说明了无论任何服务都要重写OnBind方法,所以我们先重写该方法:

1         public override Android.OS.IBinder OnBind(Android.Content.Intent intent)
2         {
3             return null;
4         }

然后是OnCreate方法:

1         public override void OnCreate()
2         {
3             base.OnCreate();
4             Log.Debug("xamarin", "创建服务");
5         }

接着是OnStartCommand方法:

1         public override StartCommandResult OnStartCommand(Android.Content.Intent intent, StartCommandFlags flags, int startId)
2         {
3             Log.Debug("xamarin", "启动服务");
4             return StartCommandResult.Sticky;
5         } 

最后就是OnDestroy方法:

1         public override void OnDestroy()
2         {
3             base.OnDestroy();
4             Log.Debug("xamarin", "关闭服务");
5         }

这样一个简单的服务就完成了,下面是整体代码:

 1     [Service]
 2     public class MainService : Service
 3     {
 4         public override void OnCreate()
 5         {
 6             base.OnCreate();
 7             Log.Debug("xamarin", "创建服务");
 8         }
 9
10         public override StartCommandResult OnStartCommand(Android.Content.Intent intent, StartCommandFlags flags, int startId)
11         {
12             Log.Debug("xamarin", "启动服务");
13             return StartCommandResult.Sticky;
14         }
15
16         public override void OnDestroy()
17         {
18             base.OnDestroy();
19             Log.Debug("xamarin", "关闭服务");
20         }
21
22         public override Android.OS.IBinder OnBind(Android.Content.Intent intent)
23         {
24             return null;
25         }
26 } 

五、启用与停止服务

有了上面的服务我们现在就可以开启它了,开启服务的方法如下:

 StartService(new Intent(this, typeof(MainService)));

停止服务的方法如下:

StopService(new Intent(this, typeof(MainService)));

首先打开Main.axml,再拖拽一个按钮进去,并设置他们的Text,以及id为@+id/startButton@+id/stopButton,结果如下:

接着打开MainActivity.cs文件,为这两个按钮绑定监听事件:

 1     public class MainActivity : Activity
 2     {
 3         protected override void OnCreate(Bundle bundle)
 4         {
 5             base.OnCreate(bundle);
 6             SetContentView(Resource.Layout.Main);
 7             Button startButton = FindViewById<Button>(Resource.Id.startButton);
 8             Button stopButton = FindViewById<Button>(Resource.Id.stopButton);
 9
10             startButton.Click += delegate
11             {
12                 StartService(new Intent(this, typeof(MainService)));
13             };
14
15             stopButton.Click += delegate
16             {
17                 StopService(new Intent(this, typeof(MainService)));
18             };
19         }
20 } 

最终在模拟机上进行测试,得出下面的结果:

从中可以看到多个连续的启动服务,因为笔者按下了返回退出了应用,然后再返回到应用中,开启服务,那么就只显示启动服务了,而不会经过创建服务了。

六、使用startId关闭服务

通过上面的例子,大家一定有人不停的开启服务。当然每次开启的都是一个新的服务。但是关闭服务的时候并不是关闭其中一个,而是把所有的服务都关闭了。由这个就需要考虑一种情况,就是如何区分不同的实例以及关闭不同的实例呢?

大家可以看看

服务中已经提供了专门的方法,当然如果是关闭当前的服务可以直接用StopSelf(),下面我们将OnStartCommand中重写,开启一个线程:

 1         public override StartCommandResult OnStartCommand(Android.Content.Intent intent, StartCommandFlags flags, int startId)
 2         {
 3             Log.Debug("xamarin", "启动服务");
 4             new Thread(() =>
 5             {
 6                 Log.Debug("xamarin", startId + "号服务的线程启动");
 7                 Thread.Sleep(1000);
 8                 Log.Debug("xamarin", startId + "号服务的线程关闭");
 9                 StopSelf(startId);
10             }).Start();
11             return StartCommandResult.Sticky;
12         } 

我们这里使用了StopSelft的重载版本关闭了服务。

然后我们再开始进行调试,首先我们按下一次开启服务,将出现如下的结果:

接着我们快速的点击两次开启服务,将出现如下的结果:

通过这张图我们可以看到,输出了1号和2号,同时在完成执行后,我们再点关闭服务就没有任何反应了,因为服务自己已经把自己关闭了。

七、通过Intent Filter开启服务

上面所有的服务开启方法都是通过类型开启的,但是这样的缺点显而易见,如果我们改变了服务的名称就需要改正其他的地方,而通过这节我们将可以使用字符串名称来开启服务。

这里我们需要使用IntentFilter注解属性,比如下面这样的注解属性:

则会在AndroidManifest.xml中生成如下的字符串:

1 <service android:name="ServiceStudy. MainService">
2       <intent-filter>
3         <action android:name="xamarin-cn.com.mainservice" />
4       </intent-filter>
5 </service>

我们先给MainService加上Intent Filter

1     [Service]
2     [IntentFilter(new string[]{"xamarin-cn.com.mainservice"})]
3 public class MainService : Service

然后修改开启服务地方的代码:

 1         protected override void OnCreate(Bundle bundle)
 2         {
 3             base.OnCreate(bundle);
 4             SetContentView(Resource.Layout.Main);
 5             Button startButton = FindViewById<Button>(Resource.Id.startButton);
 6             Button stopButton = FindViewById<Button>(Resource.Id.stopButton);
 7
 8             startButton.Click += delegate
 9             {
10                 StartService(new Intent("xamarin-cn.com.mainservice"));
11             };
12
13             stopButton.Click += delegate
14             {
15                 StopService(new Intent("xamarin-cn.com.mainservice"));
16             };
17         } 

这里我们依然还是使用Intent但是传递的参数已经变成了字符串。

今天就到这里……

原文地址:https://www.cnblogs.com/xtxk110/p/12174727.html

时间: 2024-10-14 04:34:52

VS/Xamarin Android开发Follow Me(五)的相关文章

VS/Xamarin Android开发Follow Me(六)

通知详解 一.发送通知的机制 在日常的app应用中经常需要使用通知,因为服务.广播后台活动如果有事件需要通知用户,则需要通过通知栏显示,而在Xamarin.Android下的通知需要获取NotificationManager服务,而该服务需要通过GetSystemService获取,同时还要传递一个标识符.获取了通知管理器后我们就可以实例化Notification,然后再由NotificationManager发送出去.这就是整个过程了.下面我们将一一详解通知. 二.前期准备 为了下面的学习和演

VS/Xamarin Android开发Follow Me(四)

获取与解析JSON 一.新建项目 1.新建一个Android项目,并命名为为NetJsonList 2.右击引用,选择添加引用,引用System.Json.dll 二.同步请求 既然是跨平台,我们自然不能按照java下的方式进行编写,否则如何跨平台呢,所以我们需要使用Syste.Net命名空间下的两个类:HttpWebRequest和HttpWebResponse. 首先打开Resources/layout/Main.axml文件 删除其他上面的控件,并拖拽一个Text(large)到其中. 接

VS/Xamarin Android开发Follow Me(一)

一.准备工作 1.创建一个空的解决方案,并命名为Phoneword 2.右击解决方案 新建->新建项目 并命名为Phoneword_Droid 二.界面 1.打开Resources文件夹->layout文件夹双击打开Main.axml 2.然后将会出现下面的界面 3.接着我们选择这个Button并删除(按下Delete),并从左边的工具箱中拖拽一个 Text(Large) 控件到该界面中,如下所示: 4.同时还要通过属性窗口修改Text的值: 5.紧接着拖拽一个Plain Text控件到之前的

xamarin.Android 开发环境

纯粹的.net程序员,没有任何android开发经验.连续折腾三天,才配置完成的xamarin.android开发环境,完成Hello World ,一路都是坑啊. 一.得新安装VS2015,把移动开发选项勾上:xamarin ,android有SDK我也勾了,但是没有用,装得很慢,也装不上.最终的结果是,我把所有与android相关的都删了,手动安装和配置JDK.Android SDK.Android NDK. 推荐个好地方:http://www.androiddevtools.cn/ 我所有

Xamarin Android开发实战(上册)大学霸内部资料

Xamarin Android开发实战(上册)大学霸内部资料 试读文档下载地址:http://pan.baidu.com/s/1jGEHhhO 密码:vcfm 介绍: 本教程是国内唯一的Xamarin Android开发专向教程.本教程详细讲解如何基于Windows系统,在Visual Studio 2013开发环境中,使用Xamarin开发Android应用APP. 目  录 第1章  Xamarin开发Anroid应用介绍 1 1.1  Xamarin基本知识 1 1.1.1  Xamari

Xamarin.Android开发实践(十五)

Xamarin.Android学习之应用程序首选项 一.前言 任何App都会存在设置界面,如果开发者利用普通控件并绑定监听事件保存设置,这 一过程会非常的枯燥,而且耗时.我们可以看到Android系统的设置界面里面的选项如此之多,是不是都是这样开发的呢?其实不然,Android已经给 我们提供了专门设计这一功能的技术,叫应用程序首选项,今天我们将学习如何使用他们来开发配置界面以及功能. 二.准备工作 首先需要理解的就是我们设置界面还是需要控件的,但是我们所使用的控件不在是普通的控件,下面我们来简

Xamarin.Android开发实践(十七)

Xamarin.Android之定位 一.前言 打开我们手中的应用,可以发现越来越多的应用使用了定位,从而使我们的生活更加方便,所以本章我们将学习如何在Xamarin中进行定位的开发. 二.准备工作 因为我们的虚拟机是运行在电脑本地的,自然就没法进行定位了,但是我们可以借助DDMS这个工具帮助我们去调试. 首先要确定你的Android SDK所在的目录,读者可以通过以下方式找到: 工具->选项 然后读者打开该文件夹下的tools文件夹,我们就可以看到里面有很多以bat结果的文件,这个时候我们打开

Xamarin.Android开发实践(十四)

Xamarin.Android之ListView和Adapter 一.前言 如今不管任何应用都能够看到列表的存在,而本章我们将学习如何使用Xamarin去实现它,以及如何使用适配器和自定义适配器(本文中的适配器的主要内容就是将原始的数据转换成了能够供列表控件显示的项). 二.简介适配器 在开始之前我们需要先了解下适配器,首先是提供给我们使用的适配器之间的关系: 下面我们将上面的适配器进行简单的介绍: BaseAdapter:顾名思义,就是所以适配器的基类,但是我们不能将其实例化,因为它是一个虚类

Xamarin.Android开发实践(九)

Xamarin.Android之ActionBar与菜单 一.选项卡 如今很多应用都会使用碎片以便在同一个活动中能够显示多个不同的视图.在 Android 3.0 以上的版本中,我们已经可以使用ActionBar提供的Tab来实现这种效果,而不需要我们自己去实现碎片的切换.ActionBar默认是不具备选项 卡功能的,所以我们需要给一个属性赋上对应的枚举,比如下面的方式将开启选项卡. 1 ActionBar.NavigationMode = ActionBarNavigationMode.Tab