简单记录一下四大组件之一的Service的简单实用。

先是最简单的用法,服务的开关,onBind方法的使用

package com.example.wkp.service;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button; public class MainActivity extends AppCompatActivity {
private Button start=null;
private Button stop=null;
private Button bind=null;
private Button unbind=null;
private Button get=null;
private MyService.MyBinder binder;
private ServiceConnection connection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//得到返回值binder
binder= (MyService.MyBinder) service;
//使用binder中的方法
Log.v("qq",String.valueOf(binder.getNum()));
} @Override
public void onServiceDisconnected(ComponentName name) { }
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
start= (Button) findViewById(R.id.start);
stop=(Button)findViewById(R.id.stop);
bind=(Button)findViewById(R.id.bind);
unbind=(Button)findViewById(R.id.unbind);
get=(Button)findViewById(R.id.getnum); final Intent intent=new Intent();
//跳转到配置文件中定义的intent-filter
// intent.setAction("SERVICE");
// intent.setPackage(getPackageName());
intent.setClass(MainActivity.this,MyService.class); start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startService(intent);
}
}); stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopService(intent);
}
}); bind.setOnClickListener(new View.OnClickListener(){ @Override
public void onClick(View v) {
bindService(intent,connection,BIND_AUTO_CREATE);
}
}); unbind.setOnClickListener(new View.OnClickListener(){ @Override
public void onClick(View v) {
unbindService(connection);
}
}); get.setOnClickListener(new View.OnClickListener(){ @Override
public void onClick(View v) {
Log.v("qq",String.valueOf(binder.getNum()));
}
}); // class btnListener implements View.OnClickListener{
//
// @Override
// public void onClick(View v) {
// switch(v.getId()){
// case R.id.bind:
// bindService(intent,connection,BIND_AUTO_CREATE);
// break;
// case R.id.unbind:
// unbindService(connection);
// break;
// case R.id.getnum:
// Log.v("qq",String.valueOf(binder.getNum()));
// break;
// default:
// break;
// }
// }
// }
}
}

MainActivity.java

package com.example.wkp.service;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
import android.widget.Button; /**
* Created by wkp on 2016/9/22.
*/
public class MyService extends Service { int num=0;
MyBinder binder=new MyBinder(); @Nullable
@Override
public IBinder onBind(Intent intent) {
Log.v("oo","binder");
return binder;
} @Override
public void onCreate() {
super.onCreate();
Log.v("hehe","service create");
num+=10;
} @Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
Log.v("hehe","service start");
} @Override
public void onDestroy() {
super.onDestroy();
Log.v("hehe","service destory");
} //创建一个Binder,用来在onBind中返回
class MyBinder extends Binder{
int getNum(){
return num;
}
}
}

MyService.java

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.wkp.service.MainActivity"> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" /> <Button android:id="@+id/start"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="start"/> <Button android:id="@+id/stop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="stop"/> <Button android:id="@+id/bind"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="bind"/> <Button android:id="@+id/unbind"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="unbind"/> <Button android:id="@+id/getnum"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="getnum"/>
</LinearLayout>

activity_main.xml

在AndroidManifest.xml中注册服务

然后是前台服务和IntentService。就是手机屏幕左上角弹出来的小图标,和广播结合有点类似推送。

package com.example.wkp.service;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; /**
* Created by wkp on 2016/9/24.
*/
public class SecondActivity extends Activity { private Button startFore=null;
private Button stopFore=null;
private Button startIntent=null;
private Button stopIntent=null;
private Intent intent1,intent2=null; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
init();
intent1=new Intent(SecondActivity.this,MyService2.class);
intent2=new Intent(SecondActivity.this,MyIntentService.class);
} //按钮控件初始化
void init(){
startFore= (Button) findViewById(R.id.startFore);
stopFore=(Button)findViewById(R.id.startFore);
startIntent=(Button) findViewById(R.id.startIntent);
stopIntent=(Button) findViewById(R.id.stopIntent); startFore.setOnClickListener(new btnListener());
stopFore.setOnClickListener(new btnListener());
startIntent.setOnClickListener(new btnListener());
stopIntent.setOnClickListener(new btnListener());
} class btnListener implements View.OnClickListener{ @Override
public void onClick(View v) {
switch(v.getId()){
case R.id.startFore:
startService(intent1);
break;
case R.id.stopFore:
break;
case R.id.startIntent:
startService(intent2);
break;
case R.id.stopIntent:
stopService(intent2);
break;
default:break;
}
}
}
}

SecondActivity.java

package com.example.wkp.service;

import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.widget.RemoteViews; /**
* Created by wkp on 2016/9/24.
*/
public class MyService2 extends Service{
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
} @Override
public void onCreate() {
super.onCreate();
//创建通知实例
Notification notification=new Notification();
//图标
notification.icon=R.drawable.books;
//内容
notification.contentView=new RemoteViews(getPackageName(),R.layout.notify);
//跳转
notification.contentIntent= PendingIntent.getActivity(this,0,new Intent(this,SecondActivity.class),0);
//开启
startForeground(1,notification);
}
}

MyService2.java

package com.example.wkp.service;

import android.app.IntentService;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log; /**
* Created by wkp on 2016/9/24.
*/
public class MyIntentService extends IntentService{ /**
* Creates an IntentService. Invoked by your subclass's constructor.
*
* @param name Used to name the worker thread, important only for debugging.
*/
public MyIntentService(String name) {
super(name);
} //必须创建一个无参的构造方法
public MyIntentService(){
super("MyIntentService");
} //开启一个新的线程,可以进行耗时操作
@Override
protected void onHandleIntent(Intent intent) {
Log.v("haha","onhandle");
Log.v("hehe",String.valueOf(Thread.currentThread().getId()));
Log.v("hehe",String.valueOf(android.os.Process.myPid()));
while(true){
try{
Thread.sleep(1000);
Log.v("pp","I am in handle");
}catch(Exception e){
e.printStackTrace();
} }
} @Override
public void onCreate() {
super.onCreate();
Log.v("haha","oncreate");
Log.v("hehe",String.valueOf(Thread.currentThread().getId()));
Log.v("hehe",String.valueOf(android.os.Process.myPid()));
} @Override
public void onDestroy() {
super.onDestroy();
Log.v("haha","ondestroy");
Log.v("hehe",String.valueOf(Thread.currentThread().getId()));
Log.v("hehe",String.valueOf(android.os.Process.myPid()));
}
}

MyIntentService.java

Service和IntentService的区别是后者开启新的线程可以进行耗时操作。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"> <Button android:id="@+id/startFore"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="startFore"/> <Button android:id="@+id/stopFore"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="stopFore"/> <Button android:id="@+id/startIntent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="startIntent"/> <Button android:id="@+id/stopIntent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="stopIntent"/>
</LinearLayout>

activity_second.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"> <ImageView
android:src="@drawable/books"
android:layout_width="wrap_content"
android:layout_height="wrap_content" /> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="前台服务"/>
</LinearLayout>

notify.xml

最后Service和Broadcast Receiver结合做一个定点报时

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.wkp.clock"> <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> <service android:name=".AlarmService"> </service> <receiver android:name=".AlarmReceiver">
<intent-filter>
<action android:name="ALARM_ACTION" />
</intent-filter>
</receiver>
</application> </manifest>

AndroidManifest.xml

package com.example.wkp.clock;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText; public class MainActivity extends AppCompatActivity { private Button start=null;
private Button stop=null;
private EditText edit=null;
private Intent intent = null;
private AlarmService.AlarmBinder binder; private ServiceConnection connection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
binder=(AlarmService.AlarmBinder)service;
} @Override
public void onServiceDisconnected(ComponentName name) { }
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
} void init(){
start= (Button) findViewById(R.id.start);
stop= (Button) findViewById(R.id.stop);
edit=(EditText)findViewById(R.id.edit); start.setOnClickListener(new btnListener());
stop.setOnClickListener(new btnListener()); //绑定服务
intent=new Intent(this,AlarmService.class);
bindService(intent,connection,BIND_AUTO_CREATE);
} class btnListener implements View.OnClickListener{ @Override
public void onClick(View v) {
switch (v.getId()){
case R.id.start:
binder.setTime(Integer.parseInt(edit.getText().toString()));
startService(intent);
break;
case R.id.stop:
binder.setState();
break;
default:
break;
}
}
}
}

MainActivity.java

package com.example.wkp.clock;

import android.app.AlarmManager;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.os.SystemClock;
import android.support.annotation.Nullable;
import android.util.Log;
import android.widget.RemoteViews; /**
* Created by wkp on 2016/9/24.
*/
public class AlarmService extends Service { private AlarmBinder binder = new AlarmBinder();
private AlarmManager manager;
private Intent intent1;
private PendingIntent pd;
private int time;
private boolean flag=true; @Nullable
@Override
public IBinder onBind(Intent intent) { //得到manager
manager = (AlarmManager) getSystemService(ALARM_SERVICE);
intent1 = new Intent(this, AlarmReceiver.class);
intent1.setAction("ALARM_ACTION");
//得到PendingIntent
pd = PendingIntent.getBroadcast(this, 0, intent1, 0);
return binder;
} @Override
public void onCreate() {
super.onCreate();
//创建通知实例
Notification notification = new Notification();
//图标
notification.icon = R.drawable.books;
//内容
notification.contentView = new RemoteViews(getPackageName(), R.layout.notify);
//跳转
notification.contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 0);
//开启
startForeground(1, notification);
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
//设置闹钟
//类型,开机到现在的时间||1970.1.1到现在的时间||。。。wakeup唤醒CPU
//具体时间计算,单位毫秒
//闹钟的意图
Log.v("hehe","alarm");
if(flag){
manager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+time*1000,pd);
}else{
manager.cancel(pd);
stopSelf();
}
return super.onStartCommand(intent, flags, startId);
} class AlarmBinder extends Binder {
void setTime(int t){
time=t;
flag=true;
} void setState(){
flag=false;
} }
}

AlarmService.java

package com.example.wkp.clock;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log; /**
* Created by wkp on 2016/9/24.
*/
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.v("hehe","receiver");
context.startService(new Intent(context,AlarmService.class));
}
}

AlarmReceiver.java

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.wkp.clock.MainActivity"> <EditText
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"/> <Button android:id="@+id/start"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="启动"/> <Button android:id="@+id/stop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="关闭"/>
</LinearLayout>

activity_main.xml

android入门——Service的更多相关文章

  1. android 入门-Service实时向Activity通过BroadcastReceiver传递数据

    引文: http://www.cnblogs.com/linjiqin/p/3147764.html <RelativeLayout xmlns:android="http://sch ...

  2. android 入门-Service

    sdk 1.7 package com.example.hellowrold; import java.util.Random; import com.example.hellowrold.R.id; ...

  3. android入门 — Service

    Service完全在后台运行,没有用户界面.使用的时候先创建Service子类,然后在AndroidManifest.xml中进行注册,同时可以通过<intent-filter.../>进 ...

  4. Android入门:Service入门介绍

    一.Service介绍 Service类似于Windows中的服务,没有界面,只是在后台运行:而服务不能自己运行,而是需要调用Context.startService(Intent intent);或 ...

  5. Android入门:绑定本地服务

    一.绑定服务介绍   前面文章中讲过一般的通过startService开启的服务,当访问者关闭时,服务仍然存在: 但是如果存在这样一种情况:访问者需要与服务进行通信,则我们需要将访问者与服务进行绑定: ...

  6. Android入门教程之我见

    真正的从安卓入门学习到实际工作也差不多一年时间了,也做了几个项目.在这期间经历了一开始学习Android的基本知识后仍旧无从下手,不知道如何开始开发一个app,到现在也开始学会注意Android架构的 ...

  7. 小猪的Android入门之路 day 1

    小猪的Android入门之路 Day 1 Android相关背景与开发环境的搭建 ------转载请注明出处:coder-pig 本节引言: 随着社会经济的发展,移动互联网的越来越热,手机APP开发显 ...

  8. 【详细】Android入门到放弃篇-YES OR NO-》各种UI组件,布局管理器,单元Activity

    问:达叔,你放弃了吗? 答:不,放弃是不可能的,丢了Android,你会心疼吗?如果别人把你丢掉,你是痛苦呢?还是痛苦呢?~ 引导语 有人说,爱上一个人是痛苦的,有人说,喜欢一个人是幸福的. 人与人之 ...

  9. Android精通教程-第一节Android入门简介

    前言 大家好,给大家带来Android精通教程-第一节Android入门简介的概述,希望你们喜欢 每日一句 If life were predictable it would cease to be ...

随机推荐

  1. Poj 1269 Intersecting Lines_几何模板

    #include <iostream> #include <math.h> #include <iomanip> #define eps 1e-8 #define ...

  2. redhat5安装jdk6、eclipse和tomcat6

    redhat5安装jdk6.eclipse和tomcat6 1.安装jdk6 首先下载jdk(jdk-6u13-linux-i586.bin),对于redhat5,本人强烈建议不要安装jdk7,因为有 ...

  3. python list求交集

    方法一: a=[1,2,3] b=[1,3,4] c=list(set(a).intersection(set(b))) print c #[1,3] 这种方法是先把list转换为set,再用set求 ...

  4. cf #214div2

     Dima and Guards Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u S ...

  5. Exchange Cards(dfs)

    Exchange Cards Time Limit: 2 Seconds      Memory Limit: 65536 KB As a basketball fan, Mike is also f ...

  6. SQL SERVER分区视图

    借助SQL SERVER分区视图,可以对SQL中的表进行集中管理,下文将以实例的方式为您详解SQL SERVER分区视图,希望对您学习SQL数据库能有所帮助. SQL SERVER分区视图给我们提供了 ...

  7. 启动监听报错:TNS-12537: TNS:connection closed TNS-12560: TNS:protocol adapter error TNS-00507: Connection closed Linux Error: 29: Illegal seek

    启动监听程序报错: 说明:在rhel5.8上安装完成oracle11g数据库后,使用netca创建完监听,启动监听时报错.还未使用dbca创建实例. [oracle@rusky-oracle11g ~ ...

  8. CSS备忘-1

    CSS 可以通过以下方式添加到HTML中: 内联样式- 在HTML元素中使用"style" 属性 内部样式表 -在HTML文档头部 <head> 区域使用<sty ...

  9. chrome调试工具常用功能整理(转)

    Elements chrome devtools 中 Elements panel 是审查 dom 元素和 css 的, 可以实时修改 dom/css. windows: ctrl + shift + ...

  10. L8_2

    4.留下pid为12345的那个sh进程,杀死系统中所有其它sh进程 ps –ef|grep sh |awk ‘{if($2!=”12345”) {print “kill “$2}}’ >kil ...