Activity、BroadcastReceiver、Service共同工作的简单例子

? Activity 好像是應用程式的眼睛,提供與User 互動之窗。

? BroadcastReceiver 好像是耳朵,接收來自各方的Intent。

? Service 好像是手,提供符合Intent 意圖之服務。

10.2.1 操作情境:

1. 此程式一開始,畫面出現兩個按鈕如下:

2. 按下<call_service>按鈕,暫停15 秒:

3. 等待15 秒後,委託Alarm Manager 發出intent。當BroadcastReceiver 接到intent時,就啟動NotifyService,此服務會回傳字串,顯示於ac01 畫面的Title 區域:

4. 按下<Exit>,程式就結束了。

10.2.2 撰寫步驟:
Step-1: 建立Android 專案:kx02。
Step-2: 撰寫BroadcastReceiver 的子類別:AlarmReceiver,其程式碼如下:、

package com.misoo.kx02;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class AlarmReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) {
context.startService(new Intent(context, NotifyService.class));
}}

Step-3: 撰寫Service 的子類別:NotifyService,其程式碼如下:

package com.misoo.kx02;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class NotifyService extends Service{
@Override protected void onCreate() {
ac01 app = ac01.getApp();
app.btEvent("from NotifyService"); }
@Override public IBinder onBind(Intent intent) { return null; }
}

Step-4: 撰寫Activity 的子類別:ac01,其程式碼如下:

package com.misoo.kx02;
import java.util.Calendar;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.view.View;
import android.view.View.OnClickListener;
public class ac01 extends Activity implements OnClickListener{
private static ac01 appRef = null;
private Button btn, btn2; boolean k = false;
@Override protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
appRef = this; setContentView(R.layout.cs);
btn = (Button)findViewById(R.id.call_service);
btn.setOnClickListener(this);
btn2 = (Button)findViewById(R.id.exit);
btn2.setOnClickListener(this);
}
public static ac01 getApp() { return appRef; }
public void btEvent( String data ) { setTitle(data); }
public void onClick(View arg0) {
if(arg0 == btn){
setTitle("Waiting... Alarm=15");
Intent intent = new Intent(ac01.this, AlarmReceiver.class);
PendingIntent p_intent = PendingIntent.getBroadcast(ac01.this, 0, intent, 0);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 15);
// Schedule the alarm!
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), p_intent); }
if(arg0 == btn2){
Intent intent = new Intent(ac01.this, AlarmReceiver.class);
PendingIntent p_intent = PendingIntent.getBroadcast(ac01.this, 0, intent, 0);
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
am.cancel(p_intent); finish();
}}}

Step-5: 修改AndroidManifest.xml 的內容,更改為:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.misoo.kx02">
<application android:icon="@drawable/icon">
<activity android:name=".ac01" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".AlarmReceiver">
</receiver>
<service android:name=".NotifyService">
</service>
</application>
</manifest>

由Activity发送过来一个消息,然后BroadcastReceiver收到,再发送intent去启动Service。

onBind负责intent的接收。Service的任务就是调用btEvent这个方法。getApp是一个Activity的方法主要是负责得到那个Activity的Context。

Activity向BroadcastReceiver发送消息,然后Receiver收到消息之后发送Intent去Service,Service就会根据消息作出一些影响UI的行动。Service实际就是一个后台运行的Activity。

转载于:https://www.cnblogs.com/Tammie/archive/2012/08/10/2632056.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linuxpython拍照_linux下python抓屏实现方法 -电脑资料

作者&#xff1a;zevolo 字体&#xff1a;[增加 减小] 类型&#xff1a;转载这篇文章主要介绍了linux下python抓屏实现方法,涉及Python操作屏幕截取的相关技巧,需要的朋友可以参考下本文实例讲述了linux下python抓屏实现方法&#xff0c;#!/usr/bin/python‘‘‘by zevolo, 201…

[html] 什么是表单域?它有哪些运用场景?

[html] 什么是表单域&#xff1f;它有哪些运用场景&#xff1f; <form></form>标签中间的部分 当点击这个表单域中的submit按钮&#xff0c;就会把表单中的数据提交到你action的属性指定的网页里面个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放…

线程执行一半断了_有的线程它死了,于是它变成一道面试题

----本文首发于公众号&#xff0c;关注文末公众号阅读体验更佳有些线程它活着&#xff0c;但它躺在池中碌碌无为&#xff1b;有的线程它死了&#xff0c;于是它变成一道面试题。这次的文章&#xff0c;要从一次阿里的面试说起。我记得那天是周一&#xff0c;刚刚经历过周末过的…

C#中的扩展方法,Linq,IO和多线程的定义和实例

前段时间学C#的上转型&#xff0c;泛型&#xff0c;lambda表达式这些应用的理解很费劲。学过之后我多多的练习了几天&#xff0c;接下来继续复习C#的其他一些概念&#xff0c;说实在的这些知识点学过之后很容易忘&#xff0c;但是都是很重要的&#xff0c;所以发表在博客上没事…

准确率 召回率_吴恩达深度学习笔记(61)-训练调参中的准确率和召回率

单一数字评估指标(Single number evaluation metric)无论你是调整超参数&#xff0c;或者是尝试不同的学习算法&#xff0c;或者在搭建机器学习系统时尝试不同手段&#xff0c;你会发现&#xff0c;如果你有一个单实数评估指标&#xff0c;你的进展会快得多&#xff0c;它可以快…

CDU集训代码:基础算法和数据结构2

做题地址&#xff1a; http://acm.hdu.edu.cn/diy/contest_login.php?cid16636 Problem A: HDU1040 排序题&#xff0c;可以直接使用c提供的排序&#xff0c;如果是JAVA&#xff0c;也可以使用自带的排序方法。C语言需要自己写排序算法。 #include<cstdio> #include<…

[html] 如何禁止input输入的历史记录

[html] 如何禁止input输入的历史记录 给form加上 autocompleteoff 可以禁止整个表单的历史记录给单个input加上 autocompleteoff 可禁止这个input的历史记录个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起…

python迷宫最短路径_python实现最短路径的实例方法

解决最短路径问题&#xff1a;(如下三种算法)(1)迪杰斯特拉算法(Dijkstra算法)(2)弗洛伊德算法(Floyd算法)(3)SPFA算法第一种算法&#xff1a;Dijkstra算法广度优先搜索解决赋权有向图或者无向图的单源最短路径问题.是一种贪心的策略算法的思路声明一个数组dis来保存源点到各个…

[html] html如何创建图片热区(img usemap)?

[html] html如何创建图片热区&#xff08;img usemap&#xff09;&#xff1f; <img src"china.gif" usemap"#mymap"><map name"mymap"><area shape"rect" href"a.html" coords"0,0,50,50"><…

探讨LoadRunner的并发用户和集合点

探讨LoadRunner的并发用户和集合点 近来跟踪一个项目&#xff0c;发现同事们在执行性能测试时&#xff0c;比较热衷于使用集合点&#xff0c;从概念上认为要得到并发用户就必须设置集合点&#xff0c;认为在执行一个压力测试脚本时&#xff0c;设置了集合点才算是有效的并发用…

python在职场的用处大吗_Python未来发展怎么样,未来办公是否都需要精通Python?...

首先&#xff0c;要先了解Python是什么&#xff1f;Python是一种计算机程序设计语言&#xff0c;又被称为胶水语言&#xff0c;可以用混合编译的方式使用c/c/java等语言的库。你可能已经听说过很多种流行的编程语言&#xff0c;比如在大学里感觉非常难学的C语言&#xff0c;进入…

spring gateway 鉴权_通过spring实现service变成controller,代码得到了简化

在网上发现了一个牛X的思路&#xff0c;在做restful的时候&#xff0c;如果业务改变&#xff0c;需要每次都修改controller&#xff0c;后来方便了&#xff0c;直接透传的方式&#xff0c;其实也比较麻烦&#xff0c;每次都要写controller。需求变了接口也发生了改变&#xff0…

java中return返回值_Java中return的用法

展开全部一、return语句总是用在方法中&#xff0c;有两个作用。一个是返回方法指定类型的值(这个值总62616964757a686964616fe59b9ee7ad9431333366306434是确定的)。一个是结束方法的执行(仅仅一个return语句)。二、实例1 。返回一个String。private String gets(){String s …

Magento 模块详解

模块&#xff08;module&#xff09;是Magento的核心。站点上的任何 一个动作&#xff08;action&#xff09;&#xff0c;无论是在前台和还是在后台的每一个操作都是通过模块来实现的。模块是可以视为一个容器&#xff0c;它可包 含下面这几项&#xff1a;设置(settings)&…

python运行别人的项目_pycharm实现在虚拟环境中引入别人的项目

如果你想引入别人的项目&#xff0c;但是呢引入的项目可能与自己原先装的模块的版本产生冲突&#xff0c;而且如果引入一个项目就在本地进行运行使用&#xff0c;每个项目用的依赖包都不大相同&#xff0c;就会导致解释器安装包过多&#xff0c;就会导致加载过慢&#xff0c;甚…

java 事件分发线程_深入浅出Java多线程(2)-Swing中的EDT(事件分发线程) [转载]...

本系列文章导航本文主要解决的问题是&#xff1a;如何使其Swing程序只能运行一个实例&#xff1f;抛开Swing&#xff0c; 我们的程序是通过java 命令行启动一个进程来执行的&#xff0c;该问题也就是说要保证这个进程的唯一性&#xff0c;当然如果能够访问系统的接口&#xff0…

java redis 分布式锁_使用Redis单实例实现分布式锁

一、前言在同一个jvm进程中时&#xff0c;可以使用JUC提供的一些锁来解决多个线程竞争同一个共享资源时候的线程安全问题&#xff0c;但是当多个不同机器上的不同jvm进程共同竞争同一个共享资源时候&#xff0c;juc包的锁就无能无力了&#xff0c;这时候就需要分布式锁了。常见…