帶過濾器的球閥,【Android】16.3 帶Intent過濾器的Services

 2023-10-06 阅读 25 评论 0

摘要:分類:C#、Android、VS2015; 創建日期:2016-03-01 一、簡介 這一節演示帶Intent過濾器的Services的基本用法。 1、配置Intent Filter 帶過濾器的球閥。不論是本地解決方案還是遠程解決方案,都可以通過intent過濾器顯式指定要調用的是哪個已啟動的服

分類: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過濾器。

運行截圖

image?? image

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));};}}
}

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/118515.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息