Android 四大组件学习之Service二

上节学习如何创建了一个Service,并且用Activity启动一个Service。这节我们在上节的基础上更加完善

这节学习用StartServer启动服务,并且在服务中每隔一秒打印出当前时间

举例说明:

MyActivity代码:

public class MyActivity extends Activity {

	private Button btn_start;
	private Button btn_end;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_myservice);

		btn_start = (Button)findViewById(R.id.button1);
                btn_end = (Button)findViewById(R.id.button2);
                btn_start.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// 启动服务
				Intent intent = new Intent(MyActivity.this, MyService.class);
				startService(intent);
			}
		});

		btn_end.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// 销毁服务
				Intent intent = new Intent(MyActivity.this, MyService.class);
				stopService(intent);
			}
		});
	}
}

MyService的代码:

public class MyService extends Service {

	@Override//必须实现的方法
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub
		Log.i("MyService", "onBind------------");
		return null;
	}

	@Override//被创建时的调用
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		Log.i("MyService", "onCreate------------");
	}

	@Override
	@Deprecated//OnStart方法现在被OnStartCommd已经取代,其实在OnStartCommand也调用了OnStart
	public void onStart(Intent intent, int startId) {
		// TODO Auto-generated method stub
		super.onStart(intent, startId);
		Log.i("MyService", "onStart------------");
	}

	@Override//启动时会调用
	public int onStartCommand(Intent intent, int flags, int startId) {
		// TODO Auto-generated method stub
		Log.i("MyService", "onStartCommand------------");

		for(int i=0; i<100; i++)
		{
			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			String  time = format.format(new Date());
			Log.i("MyService", time);

			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return super.onStartCommand(intent, flags, startId);
	}

	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		Log.i("MyService", "onDestroy------------");
	}

	@Override
	public boolean onUnbind(Intent intent) {
		// TODO Auto-generated method stub
		Log.i("MyService", "onUnbind------------");
		return super.onUnbind(intent);
	}
}

运行效果:

虽然说服务启动了,但是我们的界面却被服务的打印任务卡死了。所以对这么耗时的任务,我们必须放入一个线程中去,防止卡死GUI显示

所以我对MyService的代码做了修改:

public class MyService extends Service {

    private MyThread thread;
    private boolean stopFlag = false;
    
    @Override//必须实现的方法
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        Log.i("MyService", "onBind------------");
        return null;
    }
    
    @Override//被创建时的调用
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        //服务创建时,实例化MyThread
        thread = new MyThread();
        Log.i("MyService", "onCreate------------");
    }
    
    @Override
    @Deprecated//OnStart方法现在被OnStartCommd已经取代,其实在OnStartCommand也调用了OnStart
    public void onStart(Intent intent, int startId) {
        // TODO Auto-generated method stub
        super.onStart(intent, startId);
        Log.i("MyService", "onStart------------");
    }
    
    
    @Override//启动时会调用
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub
        Log.i("MyService", "onStartCommand------------");
        //服务运行后,启动线程
        if(!stopFlag)
        {
            thread.start();
            thread.setFlag(true);    
        }
        return super.onStartCommand(intent, flags, startId);
    }
    
    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        //服务销毁时,停止线程任务
        thread.setFlag(false);
        Log.i("MyService", "onDestroy------------");
    }
    
    @Override
    public boolean onUnbind(Intent intent) {
        // TODO Auto-generated method stub
        Log.i("MyService", "onUnbind------------");
        return super.onUnbind(intent);
    }
    
    class MyThread extends Thread
    {
        
        //设置flag
        public void setFlag(Boolean flag)
        {
            stopFlag = flag;
        }
        @Override
        public void run() {

            super.run();
            while(stopFlag)
            {
                //设置时间的输出方式
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String  time = format.format(new Date());
                
                //显示时间
                Log.i("MyService", time);
                
                try {
                    //延迟一秒
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}

运行效果如下:

当我点击启动服务的button后

可以看到当点击启动服务的按钮后,先是create, 然后是onStartCommand(Onstart)

当我接着按启动服务时:

可以看到当服务再次启动后,再次启动服务,会只调用OnStartCommand函数的

接着销毁服务:

可以看到服务销毁了,同时我们的线程任务也停止了。

ok。 今天用StartServer启动服务就说到这里。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-17 05:38:40

Android 四大组件学习之Service二的相关文章

Android 四大组件学习之Service五

本节学习IntentService, 可能就有人问了, 什么是IntentService, IntentService有什么作用? 不是已经有了Service,那为什么还要引入IntentService呢? 带着这两个问题,我们先来看一个例子: 我们新建一个MyIntentService例子: public class MyIntentService extends IntentService { private int count = 5; public MyIntentService() {

Android 四大组件学习之Activity二

上一节学习如何创建一个Activity,以及如何加载界面. 这一节学习,如何从一个Activity跳转到另外一个Activity. 首先: 先创建二个Activity, 我就用上节课的MainActivity和SecondActivity MainActivity的布局文件,就随便拖放一个TextView和一个Button: <TextView android:id="@+id/textView1" android:layout_width="wrap_content&

Android 四大组件学习之Service七

本节学习Service的分类: 本地服务, 远程服务 本地服务: 指的是服务和启动服务的activity在同一个进程中 远程服务:指的是服务和启动服务的activity不在同一个进程中 我们以前使用的都是本地服务,今天我们学习远程服务.学习远程服务就必须要学习AIDL(Android Interface Definition Language)安卓接口定义语言.编译器通过AIDL文件的描述信息生成符合通信协议的JAVA代码.我们在进程间通信的时候只需要调用即可. 既然要实现远程服务,就需要一个服

Android 四大组件学习之BroadcastReceiver二

上节学习了如何创建一个广播,也尝试接受系统打电话的广播.本节课学习如何自定义广播.自定义广播实质上也就是创建一个发送广播者,创建一个接受该广播者. 那我们就开始行动吧. 先创建一个发送广播的应用: public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setCont

Android 四大组件学习之ContentProvider二

上节学习了什么是ContentProvider.以及ContentProvider的作用.以及什么是URL.本节就对上节学习的知识做一个实践,也就是定义自己的ContentProvider 好.实践是检验真理的唯一标准. 那我们就開始行动吧 第一步: 创建一个自己的ContentProvider,我取名为MyContentProvider public class MyContentProvider extends ContentProvider { @Override public int d

Android 四大组件学习之Service六

上几节.我们学习怎样用StartServer启动一个服务,用bindServer去绑定一个服务.以及服务的生命周期,以及什么是IntentService. 也许有读者会发现,我们BindServer中的第二个參数也就是ServiceConnection这种方法在将用bindService时好像没用到. 那本节课就学习. 那我们先说个事.上大学的时候.我学习不好,还是那种常常旷课的同学. 长期下去,老师跟前就混的不好了. 有次班里评选党员,我就想竞争一下,可是因为我常常不上课的同学,自然几率就小,

Android 四大组件学习之Service四

本节学习Service的生命周期. 既然Activity有生命周期,那同理Service也有自己的生命周期. 和学习Activity一样,我们先贴出Google官网给Service下的定义,以及生命周期图 从图中可以看到,左面一路下来是我们第二节课中说的用StartServer启动服务的流程.右面一路下来的是第三节中说的用BindService启动服务的流程. 在上两节中都看到了如何启动服务,同时销毁服务.既然这年代是混搭的年代,那当然也需要这两种服务混搭起来使用. 先来看看MyActivity

Android 四大组件学习之Service三

上节我们学习了,如何用StartService启动服务,这节学习如何用BindService启动一个服务 首先看MyActivity的代码部分: public class MyActivity extends Activity { private Button btn_start; private Button btn_end; private MyServiceConnection sConnection; @Override protected void onCreate(Bundle sa

Android学习之路——Android四大组件之activity(二)

上一篇讲了activity的创建和启动,这一篇,我们来讲讲activity的数据传递 activity之间的数据传递,这里主要介绍的是activity之间简单数据的传递,直接用bundle传递基本数据类型的数据.还有一种数据类型是parcelable和serialable 用bundle 传递数据有两种情况,这篇文章就分别从两个方面说明一下. 一.利用bundle传递基本数据类型 1.启动时传递数据,使用intent的put方法,将数据写入bundle中,然后startActivity(inte