Android Service与Runnable整合并用

转载 2012年03月30日 00:03:54

http://www.360doc.com/content/12/0209/15/3700464_185309016.shtml


服务的启动没有Activity,即便是利用Activity带起服务,也会有各看成独立的事件及焦点要处理。

Service继承自Android.app.Service。

服务的生态链就先从onCreate()开始(如果有重写的话) ,接着应会进入启动服务onStart(),默认继承的Service类,并不一定要有onStart(),但是一定要重写public IBinder onBind(Intent intent)方法。

 package cn.iimob;


import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class demo extends Activity {
    private Button btnStartService,btnStopService;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btnStartService=(Button)findViewById(R.id.btnStartService);
        btnStopService=(Button)findViewById(R.id.btnStopService);
        btnStartService.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                //构建 Intent 对象,指定打开对象为 MyService服务
                Intent i=new Intent(demo.this, MyService.class);
                //设置新Task的方式
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                //以startService 方法启动 Intent
                startService(i);
            }
        });
        btnStopService.setOnClickListener(new Button.OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // 构建 Intent对象,指定关闭的对象为MyService服务
                Intent i=new Intent(demo.this, MyService.class);
                
                //以stopService 方法关闭 Intent
                stopService(i);
            }
        });
    }
}

 package cn.iimob;


import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;

/**
 * 
 *  @Project       : servicedemo
 *  @Program Name  : cn.iimob.MyService.java
 *  @Class Name    : MyService
 *  @Description   : 自定义 MyService 类继承 Service 类
 *  @Author        : zh
 *  @Creation Date : 2011-11-3 上午09:49:00 
 *  @ModificationHistory  
 *  Who        When          What 
 *  --------   ----------    -----------------------------------
 *  username   2011-11-3       TODO
 
*/
public class MyService extends Service {

    /**
     * 创建 Handler 对象,作为进程 传递 postDelayed 之用
     
*/
    private Handler myhandler = new Handler();
    
    /**
     * 为了确认系统服务运行情况
     
*/
    private int intCounter=0;
    
    /**
     * 成员变量 myTasks为Runnable对象,作为Timer之用
     
*/
    private Runnable myTasks=new Runnable() {
        /**
         * 进程运行
         
*/
        @Override
        public void run() {
            // TODO Auto-generated method stub
            
//递增counter整数,作为后台服务运行时间识别
            intCounter++;
            //以Log 对象在LogCat 里输出Log信息,监看服务运行情况
            Log.i("Run Service", "Counter:"+Integer.toString(intCounter));
            myhandler.postDelayed(myTasks, 1000);
        }
    };
    
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    
    @Override
    public void onStart(Intent intent,int startId){
        myhandler.postDelayed(myTasks, 1000);
        super.onStart(intent, startId);
        Log.i("Start Service", "onStart");
    }
    
    @Override
    public void onCreate(){
        super.onCreate();
        Log.i("Create Service", "onCreate");
    }
    
    @Override
    public void onDestroy(){
        //当服务结束,删除 mTasks 运行线程 
        myhandler.removeCallbacks(myTasks);
        super.onDestroy();
        Log.i("Destroy Service", "onDestroy");
    }
    
    
}

 

 <?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"
    
>
<TextView  
    
android:layout_width="fill_parent" 
    android:layout_height
="wrap_content" 
    android:text
="@string/hello"
    
/>
<Button
android:text
="开始Service"
android:id
="@+id/btnStartService"
android:layout_width
="wrap_content"
android:layout_height
="wrap_content">
</
Button>

<Button
android:text
="终止Service"
android:id
="@+id/btnStopService"
android:layout_width
="wrap_content"
android:layout_height
="wrap_content"></Button>
</LinearLayout>

 

 <?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package
="cn.iimob"
      android:versionCode
="1"
      android:versionName
="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".demo"
                  android:label
="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!-- 创建 Service,给予类的名称  -->
        <!-- 创建 android:exported属情为true,表示此服务可被其他程序访问  -->
        <service android:name=".MyService" android:exported="true" android:process=":remote"></service>
    </application>
    <uses-sdk android:minSdkVersion="8" />

</manifest> 

Android Runnable 运行在那个线程

Runnable 并不一定是新开一个线程,比如下面的调用方法就是运行在UI主线程中的: Handler mHandler=new Handler(); mHandler.post(n...
  • meegomeego
  • meegomeego
  • 2014年02月26日 17:14
  • 1432

android开发笔记之handler+Runnable的一个巧妙应用

1. 一个有趣Demo: (1)定义一个handler变量 private final Handler mHandler = new Handler(); (2)定义一个Runnable变...
  • hfreeman2008
  • hfreeman2008
  • 2013年09月28日 14:47
  • 2722

java看看我是怎么利用数组给Runnable线程传参数的1

问题来源于给Runnable 接口的线程传参数…… 多个线程,传进去的参数全不一样…… 比如进去的、出来的…… 先看个(游戏)参与者类: public class Playe2r {...
  • aw344
  • aw344
  • 2013年09月07日 18:15
  • 7109

你不知道的Runnable接口,深度解析Runnable接口

本文描述的是Android中的Runnable接口 。因Android中的线程源自于Java,所以首先需要了解Java中的线程!  详情请看这篇文章Android(线程一) 线程  !     Jav...
  • zxw136511485
  • zxw136511485
  • 2016年11月04日 14:12
  • 16553

Android开发:Handler Runnable和Thread之间的区别和联系 应用--------------------看完本篇,从此一览无余!

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()...
  • yanzi1225627
  • yanzi1225627
  • 2013年02月16日 00:47
  • 29575

Android开发之多线程编程Thread和Runnable使用

Android可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;前者只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一...
  • mad1989
  • mad1989
  • 2014年07月28日 18:03
  • 44433

android之Runnable与Thread的区别详解

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()...
  • zhongwn
  • zhongwn
  • 2014年04月22日 17:38
  • 572

【Android开发】线程与消息处理-通过实现Runnable接口来创建线程

利用Runnabe接口来创建线程,实现这样一个效果:在屏幕上有一个"开始"和一个"结束"按钮,单击"开始"按钮,将在日志(Log)面板中输出循环变量的值;单击"停止"按钮,将终端线程。 界面资源文件...
  • u013517797
  • u013517797
  • 2015年06月02日 23:18
  • 1750

从Handler.post(Runnable r)再一次梳理Android的消息机制(以及handler的内存泄露)

Handler每个初学Android开发的都绕不开Handler这个“坎”,为什么说是个坎呢,首先这是Android架构的精髓之一,其次大部分人都是知其然却不知其所以然。今天看到Handler.pos...
  • ly502541243
  • ly502541243
  • 2016年07月29日 10:25
  • 23916

spring新线程中注入为空指针的问题

使用了ApplicationContext来注入,这个的确有效,但防止多次加载配置文件,所以放在静态代码块中,原先程启动也放在了静态代码块中。 主线程中可以直接使用@Autowired注解进行注入,但...
  • u010127245
  • u010127245
  • 2016年04月14日 13:18
  • 7490
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android Service与Runnable整合并用
举报原因:
原因补充:

(最多只允许输入30个字)