這篇利用來製作一個會出現在Notification的時鐘,來敘述一下 Service,在你製作的App被關閉時,可以透過Service繼續運行你想處理的部分,當然Service 也有其生命周期


接下來我們來介紹一下今天的案例:

當按下開始報時服務按鈕時,就會啟動Service,並且更新Notification 如下:

之後就算離開APP他的秒數也是會繼續跑的跟現在時間同步,之後按下停止報時服務才會將其終結..
1.首先我們得在專案裡面建立一個 RemindService.cs 當然這是自己命名的 ,他必須繼承Service

namespace XamarinServiceTest
{
    //此 attribute 一定要加
    [Service]
    public class RemindService : Service
    {
    ...

之後因為方便我對Notification 更新資料,我在這 ReminService 寫一個專門更新 Notification的method :

/// <summary>
/// 簡單包裝Notification 
/// 詳情可以參考 
/// http://no2don.blogspot.com/2013/07/xamarin-notification.html
/// </summary>
/// <param name="id">Notify id</param>
/// <param name="content">Notify content</param>
private void NotiSomething(int id, string content)
{
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
       .SetContentTitle(content)
       .SetSmallIcon(Resource.Drawable.Icon2);
 
 
    var notificationManager = (NotificationManager)GetSystemService(Context.NotificationService);
    //都用同一組id
    notificationManager.Notify(id, builder.Build());
}

因為每秒更新,所以我必須 宣告一隻 Timer

private System.Timers.Timer TimerMainTask { get; set; }

在Service 開始時,只要複寫 OnStartCommand 即可,在內容我就寫啟動 TimerMainTask讓TimerMainTask每一秒鐘都去更新Notification資訊

 
/// <summary>
/// 開始Service 開始時呼叫
/// </summary>
/// <param name="intent"></param>
/// <param name="flags"></param>
/// <param name="startId"></param>
/// <returns></returns>
public override StartCommandResult OnStartCommand(Android.Content.Intent intent, StartCommandFlags flags, int startId)
{
    TimerMainTask = new System.Timers.Timer(1000);
    TimerMainTask.Elapsed += TimerMainTask_Elapsed;
    TimerMainTask.Start();
    NotiSomething(4, "開始進入" + System.DateTime.Now.ToString("hh:mm:ss"));
 
    return StartCommandResult.Sticky;
}
 
/// <summary>
/// 每次timer 做的事情
/// 設計為一秒跑一次 
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void TimerMainTask_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    NotiSomething(1, "當麻報時-" + System.DateTime.Now.ToString("hh:mm:ss"));
}

再來就是當Service 停止時,必須要將TimerMainTask關掉:

/// <summary>
/// 當Service 停止時呼叫
/// </summary>
public override void OnDestroy()
{
    NotiSomething(4, "已停止" + System.DateTime.Now.ToString("hh:mm:ss"));
    TimerMainTask.Stop();
    base.OnDestroy();
}

2.第一步完成後,接下來就是在AndroidManifest.xml 加入Service服務

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.donma.xamarin.servicetest" android:installLocation="auto">
    <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8" />
    <application android:label="XamarinServiceTest"></application>
  <service android:name="XamarinServiceTest.RemindService"></service>
</manifest>

就是加入 <service android:name="XamarinServiceTest.RemindService"></service>

3. 主程式中將RemindService 呼叫起來:

var btnStart = FindViewById<Button>(Resource.Id.btnStart);
btnStart.Click += delegate
{
    StartService(new Intent(this, typeof(RemindService)));
    Toast.MakeText(this, "開始Service", ToastLength.Short).Show();
};

關閉RemindService

var btnEnd = FindViewById<Button>(Resource.Id.btnEnd);
btnEnd.Click += delegate
    {
        StopService(new Intent(this, typeof(RemindService)));
        Toast.MakeText(this, "停止Service", ToastLength.Short).Show();
    };

結果:



reference :

http://docs.xamarin.com/guides/android/application_fundamentals/services/part_1_-_started_services

https://developer.android.com/training/run-background-service/index.html

[Xamarin] 用Service 來製作一個Notification的時鐘 (转帖)的更多相关文章

  1. [Xamarin] 製作吐司(Toast)以及圖文並茂的Toast (转帖)

    最近在看Xamarin使用C#來撰寫Android App . 紀錄一下,順便給之後有需要的人可以有所參考 :) 今天要來聊的是關於Toast 這東西,這在以前Android 上面我是很常使用 拿來l ...

  2. concat函數 函數concat 可以用來合拼兩個或以上的字串。

    12. “Mexico 墨西哥”的首都是”Mexico City”. 顯示所有國家名字,其首都是國家名字加上”City”. concat函數 函數concat 可以用來合拼兩個或以上的字串. : SE ...

  3. [Xamarin] 透過 intent-filter 來接管 http ,製作偽瀏覽器 (转帖)

    使用Android 的朋友一定對這畫面不陌生在開啟網址的時候,或是Youtube連結的時候,因為Android 發現,你手機安裝的App有哪些可以支援這些東西的瀏覽 所以,就可以使用甚麼東西來進行開啟 ...

  4. [Xamarin] 製作Options Menu、Intent 呼叫網址和Market (转帖)

    Android的設計如果沒意外的話通常有三棵按鈕,BACK,HOME,OPTION (圖片來源:http://developer.android.com/design/index.html) 在OPT ...

  5. [Xamarin] 使用Webview 來做APP (转帖)

    有時候,企業要求的沒有這麼多,他原本可能官方網站就已經有支援Mobile Web Design 他只需要原封不動的開發一個APP 也或是,他只是要型錄型,或是問卷調查的型的APP,這時候透過類似像if ...

  6. CSS製作動畫效果(Transition、Animation、Transform)

    CSS 2D Transforms https://www.w3schools.com/css/css3_2dtransforms.asp CSS 3D Transforms https://www. ...

  7. yii框架製作簡易RBAC權限管理

    控制器源碼 <?php namespace app\controllers; use yii; use yii\web\Controller; class PowerController ext ...

  8. 需要重刷整個 image 的時機 - 1

    最近遇到一個問題, gpio 讀出來的值與預期不同, 詳細描述如下: 首先手機 download 了一個完整的 daily build image , 接下來 不斷地修改 kernel 部分 code ...

  9. 鸟哥之安裝 CentOS7.x

    http://linux.vbird.org/linux_basic/0157installcentos7.php since 2002/01/01 新手建議 開始閱讀之前 網站導覽 Linux 基礎 ...

随机推荐

  1. Django自定义分页、bottle、Flask

    一.使用django实现之定义分页 1.自定义分页在django模板语言中,通过a标签实现; 2.前段a标签使用<a href="/user_list/?page=1"> ...

  2. 添加图片按钮-UI界面编辑器(SkinStudio)教程

    打开工具箱,选择Button控件 在窗体上添加一个Button控件 给Button控件的ImageNormal属性添加图片 添加完成后的效果 删除Text属性的值(即删除显示的文本)

  3. 6.Mybatis中的动态Sql和Sql片段(Mybatis的一个核心)

    动态Sql是Mybatis的核心,就是对我们的sql语句进行灵活的操作,他可以通过表达式,对sql语句进行判断,然后对其进行灵活的拼接和组装.可以简单的说成Mybatis中可以动态去的判断需不需要某些 ...

  4. LINUX内核分析第八周学习总结:进程的切换和系统的一般执行过程

    韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.进程切换的关 ...

  5. 循序渐进Python3(三) -- 0 -- 初识函数

    函数 如果我们要计算一个圆的面积,就需要知道它的半径,然后根据公式S=3.14*r*r算出它的面积,如果我们要算100个圆的面积,则每次我们都需要写公式去计算,是不是很麻烦,但是有了函数的话,我们就不 ...

  6. RedHat下安装OPENCV

    1.解压 unzip opencv-2.4.9.zip 2.进入目录,cmake CMakeLists.txt  生成build文件 3.使用命令 make 编译 4.使用命令 make instal ...

  7. lucene prefixQuery

    prefixQuery是lucene的一个前缀匹配的搜索功能,但是它的前缀匹配不是完全的前缀匹配,的query生成是:易* 但是能把所有带有易字的都搜到... 下面是实验:出现了交易...

  8. wpf 旋转效果

    <Grid> <Grid.Triggers> <EventTrigger RoutedEvent="Page.Loaded"> <Begi ...

  9. CCKJ 笔试

    面向对象三个特性: 面向对象技术是目前流行的系统设计开发技术,它包括面向对象分析和面向对象程序设计.面向对象程序设计技术的提出,主要是为了解决传统程序设计方法--结构化程序设计所不能解决的代码重用问题 ...

  10. 初步认识JUnit

    初步认识JUnit 目前大多数的基于Java的企业应用软件,肯定少不了单元测试,程序员通过编写单元测试来验证自己程序的有效性:管理者通过持续自动的执行单元测试和分析单元测试覆盖率来确保软件本身的质量. ...