用service在后台开线程+广播做一个计时器

1.首先写一个服务,在onStartCommand方法里开启线程,每次startService就会调一次onStartCommand方法

import java.util.List;

import android.app.Notification;

import android.app.NotificationManager;

import android.app.PendingIntent;

import android.app.Service;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.media.MediaPlayer;

import android.os.Binder;

import android.os.Handler;

import android.os.IBinder;

import android.util.Log;

public class LocalService extends Service {

public static final String ACTION = "com.happyparking.service.LocalService";

private static final String TAG = "LocalService";

private IBinder binder = new LocalService.LocalBinder();

final Handler handler = new Handler();

int lastTime = 0;

boolean running = false;

Intent intent = new Intent(); // Itent就是我们要发送的内容

Runnable runnable = new Runnable() {

@Override

public void run() {

Log.e(TAG, "线程," + "倒计时=" + lastTime);

handler.postDelayed(this, 1000);// 50是延时时长

lastTime = lastTime - 1;

intent.putExtra("time", lastTime);

intent.setAction(Configs.Time_Action); // 设置你这个广播的action,只有和这个action一样的接受者才能接受者才能接收广播

sendBroadcast(intent);

if (lastTime <= 0) {

Log.e(TAG, "结束.....");

handler.removeCallbacks(this);

running = false;

}

}

};

@Override

public IBinder onBind(Intent intent) {

return binder;

}

@Override

public void onCreate() {

Log.e(TAG, "onCreate");

// 这里可以启动媒体播放器

// if(mediaPlayer==null)

// mediaPlayer=MediaPlayer.create(this, uri);

super.onCreate();

}

@Override

public void onStart(Intent intent, int startId) {

super.onStart(intent, startId);

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

Log.e(TAG, "onStartCommand");

if (running)

handler.removeCallbacks(runnable);

if(intent!=null)

lastTime = intent.getIntExtra("time", 0);

handler.postDelayed(runnable, 1000);

running = true;

Log.e(TAG, "onStart" + "开始倒计时=" + lastTime);

return START_STICKY;

}

@Override

public void onDestroy() {

Log.e(TAG, "onDestroy");

// handler.removeCallbacks(runnable);

stopSelf();

super.onDestroy();

}

// 定义内容类继承Binder

public class LocalBinder extends Binder {

// 返回本地服务

public LocalService getService() {

return LocalService.this;

}

}

}

2.在清单文件里面注册广播

<service android:name="com.happyparking.service.LocalService" >

<intent-filter>

<action android:name="com.happyparking.service.LocalService" />

</intent-filter>

</service>

3.在activity或者片段里面写广播,接收条件,注册广播,记得推出界面后注销广播

private void initReceiver() {

timeReceiver = new TimeReceiver();

IntentFilter filter = new IntentFilter();

filter.addAction(Configs.Time_Action); // 只有持有相同的action的接受者才能接收此广播

getActivity().registerReceiver(timeReceiver, filter);

}

public class TimeReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context arg0, Intent intent) {

// TODO Auto-generated method stub

if (intent != null) {//在这里面接收信息

}

}

//注销广播

@Override

public void onDestroy() {

// TODO Auto-generated method stub

super.onDestroy();

getActivity().unregisterReceiver(timeReceiver);

}

4.开启广播,可以带入信息,第一次会启动onStart,此后不再启动onStart,但onStartCommand每次都会开启:

public void sendMyService() {

Intent service = new Intent(LocalService.ACTION);//LocalService.ACTION是广播条件

service.putExtra("time", second);//带入信息,

// ((MainActivity)content).startMyService(10,(TextView)mMenuView.findViewById(R.id.tvTime));

content.startService(service);

}

时间: 2024-09-30 06:38:17

用service在后台开线程+广播做一个计时器的相关文章

ios之申请后台延时执行和做一个假后台的方法

转自:http://sis hu ok.com/forum/blogCategory/showByCategory.html?categories_id=138&user_id=10385   居然话sis hu ok.com违禁 嗨~~~   想看原文请把空格去掉 我们知道,到我们程序从前台退到后台(安home)键后,将执行程序的委托方法. // 当应用程序掉到后台时,执行该方法 - (void)applicationDidEnterBackground:(UIApplication *)ap

做一个计时器示例 在页面上有一个文本框和一个普通按钮 在状态栏上显示,单击按钮,开始计时的提示信息 单击按钮时,在文本框显示计数的过程,同时要求按钮上的字,显示为“单击暂停” 此时单击按钮,暂停计时,同时按钮上的字显示为“继续计时”,要求这两种状态来回切换,来完成计数器的功能

2015-04-12 20:15:25 方法一; <script> var s=0; var timeout=0; status='点击按钮,开始计时'; function count(){ s++; time1.value=s; timeout=setTimeout('count();',100); } function onChange(){ if(timeout==0){ count(); time2.value='暂停计时'; status='点击按钮,暂停计时'; }else{ cl

《App后台开发运维和架构实践》推荐序

软件开发工具的成长速度远远超过开发人员的成长速度,这是现实. 每个月,甚至每天,我们都可以见到新的类库.框架.工具.语言.它们或者极大地降低了开发的成本,或者极大地提升了开发的效率. 随之而来的问题就是,如何让开发人员妥善地运用好这些工具? 曾经有好几个做开发的同事跟我说:"写软件谁不会?从网上找些开源的类和项目来改改就是了".目前也确实充斥着这种"改改就是"的工作思维.介绍某个类库和项目如何安装和调用的文章俯拾皆是. 但是每种工具究竟有什么优缺点?适合用来解决什么

python全栈开发基础【第二十四篇】(利用threading模块开线程、join与守护线程、GIL与Lock)

一多线程的概念介绍 threading模块介绍 threading模块和multiprocessing模块在使用层面,有很大的相似性. 二.开启多线程的两种方式 创建线程的开销比创建进程的开销小,因而创建线程的速度快. #开启进程的第一种方式 from multiprocessing import Process from threading import Thread import os import time def work(): print('<%s> is running'%os.g

利用threading模块开线程

一多线程的概念介绍 threading模块介绍 threading模块和multiprocessing模块在使用层面,有很大的相似性. 二.开启多线程的两种方式 1 1.创建线程的开销比创建进程的开销小,因而创建线程的速度快 2 from multiprocessing import Process 3 from threading import Thread 4 import os 5 import time 6 def work(): 7 print('<%s> is running'%o

利用threading模块开线程方法

一多线程的概念介绍threading模块介绍threading模块和multiprocessing模块在使用层面,有很大的相似性.二.开启多线程的两种方式1.创建线程的开销比创建进程的开销小,因而创建线程的速度快from multiprocessing import Processfrom threading import Threadimport osimport timedef work():print('<%s> is running'%os.getpid())time.sleep(2)

shell命令、调度工具、后台执行线程和软连接

一.shell命令 1.后缀.sh 第一行需要加#!/bin/bash 没有的话,需呀sh 命令执行 示例test.sh: #!/bin/bash date ./test.sh 提示没有权限,此时,需要chmod 744 test.sh 二.调度工具 1.airflow 2.azkaban 3.rundeck 4.Linux自带的调度工具:crontab *代表每的意思 使用crontab --help可以看到,-e表示编辑,-l表示产看内容 示例:crontab -e * * * * * /r

Android 双进程Service常驻后台,无惧“一键清理”

本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处! 最近项目用到Service常驻后台,研究了一下发现手Q和微信都是使用了双进程来保证一键清理后自动复活,copy网上双进程Service的例子,再结合onTrimMemory(),基本实现一键清理后自动复活. 使用双进程Service,关键是在AndroidManifest.xml里面定义Service时加入android:process=":service1": <service andro

Java-用户(前台)线程和守护(后台)线程

1.守护(后台)线程 Daemon Thread 守护线程的作用是为其他线程的运行提供便利服务,比如垃圾回收线程就是一个守护线程 a.守护线程创建的子线程也是守护线程 b.可以设置线程为守护线程(setDaemon(boolean on)),但是必须在调用start方法之前,否则抛异常. c.不要认为所有的应用都可以分配给Daemon来进行服务,比如读写操作或者计算逻辑. 因为一旦所有的用户线程执行完毕,虚拟机将退出,而守护线程将被强制退出. 2.用户(前台)线程 User Thread