分類:C#、Android、VS2015;
創建日期:2016-03-01
一、簡介
這一節演示帶Intent過濾器的Services的基本用法。
1、配置Intent Filter
帶過濾器的球閥。不論是本地解決方案還是遠程解決方案,都可以通過intent過濾器顯式指定要調用的是哪個已啟動的服務。換言之,Intent過濾器主要解決的問題是:在Activity中調用StartService方法啟動自定義的Service類以后,通過Intent過濾器指定調用的是已啟動的服務中的哪些服務(過濾掉其他的服務)。當然,其他應用程序也可以用這種方式來實現。
在C#代碼中,可以用[IntentFilte(…)]特性聲明來自動注冊Intent過濾器,其作用就像可以用[Service]特性聲明自動注冊服務一樣,也是讓系統自動修改AndroidManifest.xml配置文件,而不需要我們去手工在AndroidManifest.xml文件中注冊配置信息。
例如,下面的代碼將Intent過濾器與 mj.demos.DemoService 關聯在一起:
namespace ServiceDemo1 {[Service][IntentFilter(new String[]{"mj.demos.ServiceDemo1"})]public class MyService : Service{……} }
通過C#代碼聲明Service特性和IntentFilter特性以后,系統就會自動在AndroidManifest.xml文件中添加下面的配置:
<service android:name="servicedemo1.MyService"><intent-filter><action android:name="mj.demos.MyService" /></intent-filter> </service>
其中,“servicedemo1.MyService”中的servicedemo1是將命名空間ServiceDemo1全部變為小寫字母后的結果,MyService是自定義的服務名。
android中間件、這樣一來,就可以在任何類中調用StartService方法,并在參數中傳遞Intent過濾器。例如,下面的代碼演示了如何在某個Activity中傳遞Intent過濾器:
StartService (new Intent ("mj.demos.MyService"));
下面的代碼演示了如何停止過濾服務:
StopService (new Intent ("mj.demos.MyService"));
2、通知用戶
Android intent、利用前面章節介紹的通知用戶的辦法,可將后臺運行的Service的狀態或結果告訴用戶,比如傳輸一個大文件時,告訴用戶后臺傳輸已完成等。
二、示例2--StartedServiceDemo2
該例子與上一節介紹的StartedServiceDemo1的運行結果相同。不同的是在這個例子中添加了Intent過濾器。
運行截圖
??android intentservice、
主要設計步驟
(1)添加ch1602_Main.axml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><Buttonandroid:id="@+id/ch1602StartService"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="啟動服務" /><Buttonandroid:id="@+id/ch1602StopService"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="停止服務" /> </LinearLayout>
(2)添加ch1602ServiceDemo.cs
using System; using Android.App; using Android.Content; using Android.OS; using Android.Runtime; using Android.Widget; using System.Threading;namespace MyDemos.SrcDemos {[Service][IntentFilter(new string[] { action })]public class ch1602ServiceDemo : Service{public const string action = "MyDemos.ch1602Service";Thread thread;[return: GeneratedEnum]public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId){var myHandler = new Handler(MainLooper);myHandler.Post(() =>{Toast.MakeText(this, "服務已啟動", ToastLength.Short).Show();});thread = new Thread(() =>{for (int i = 1; i <= 10; i++){var msg = string.Format("這是來自服務的第{0}個消息", i);Thread.Sleep(TimeSpan.FromSeconds(4));myHandler.Post(() =>{Toast.MakeText(this, msg, ToastLength.Short).Show();});}StopSelf();});thread.Start();return StartCommandResult.Sticky;}public override void OnDestroy(){base.OnDestroy();thread.Abort();new Handler(MainLooper).Post(() =>{Toast.MakeText(this, "服務已停止", ToastLength.Short).Show();});}//基類要求實現的接口public override IBinder OnBind(Intent intent){return null;}} }
(3)添加ch1602MainActivity.cs
using Android.App; using Android.Content; using Android.OS; using Android.Widget;namespace MyDemos.SrcDemos {[Activity(Label = "ch1602MainActivity")]public class ch1602MainActivity : Activity{protected override void OnCreate(Bundle savedInstanceState){base.OnCreate(savedInstanceState);SetContentView(Resource.Layout.ch1602_Main);var start = FindViewById<Button>(Resource.Id.ch1602StartService);start.Click += delegate{StartService(new Intent(ch1602ServiceDemo.action));};var stop = FindViewById<Button>(Resource.Id.ch1602StopService);stop.Click += delegate{StopService(new Intent(ch1602ServiceDemo.action));};}} }