- 浏览: 3903840 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
hinuliba:
...
字体背景颜色的高度修改 -
KANGOD:
最后的 -createDialog() 私有方法是怎么回事,没 ...
简单的实现listView中item多个控件以及点击事件 -
sswangqiao:
呵呵,呵呵
onActivityResult传值的使用 -
yumeiqiao:
感觉你所的不清楚 lstView.setOnTouchLi ...
listview中viewflipper的问题 -
lizhou828:
果然是大神啊!!!
Animation动画效果的实现
http://www.androidcompetencycenter.com/2009/01/basics-of-android-part-iii-android-services/
本文出自:
Many a times the application needs to do some tasks in the background for which user interventions is not required (or very less intervention is required). These background processes keeps working even if user is using some other application on the phone. To define such background processes android has a concept of Services. Service in android is long lived application component. Service doesn’t implement any User Interface. Common example of service is Media Player application that keeps playing song in the background, file download application that can download the file in the background. Let’s see how to create a service. Creating a service Android has defined a base class for all services as ‘Service’. All the services have to extend from this Service class. Service class defines service lifecycle methods like onCreate(), onStart(), onDestroy(). Here is the example a service class package com.wissen.testApp.service; public class MyService extends Service { @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); Toast.makeText(this, "Service created...", Toast.LENGTH_LONG).show(); } @Override public void onDestroy() { super.onDestroy(); Toast.makeText(this, "Service destroyed...", Toast.LENGTH_LONG).show(); } } The above service is notifying the user when the service is created and service is destroyed. Like every thing else in android, Service in android are also associated with the intents. This intent is required while using the service. The service entry has to be done in the AndroidManifest.xml file along with the service intent as shown below: <service class=".service.MyService"> <intent-filter> <action android:value="com.wissen.testApp.service.MY_SERVICE" /> </intent-filter> </service> Now our service is created and can be used by the application code. Using the service: The application can start the service with the help of Context.startService method. The method will call the onCreate method of the service if service is not already created; else onStart method will be called. Here is the code to start the MyService .. Intent serviceIntent = new Intent(); serviceIntent.setAction("com.wissen.testApp.service.MY_SERVICE"); startService(serviceIntent); The service started with startService method will keep on running until stopService() is called or stopSelf() method is called. Another way to use service is to bind to the service. The service contented this way will be considered required by the system only for as long as the calling context exists. To bind to the service a service connection object need to be created. The service connection object tell the application when the service is connected or disconnected. Here is how you can bind to the service. … ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.i("INFO", "Service bound "); @Override public void onServiceDisconnected(ComponentName arg0) { Log.i("INFO", "Service Unbound "); } } bindService(new Intent("com.wissen.testApp.service.MY_SERVICE"), conn, Context.BIND_AUTO_CREATE); } … The application can communicate with the service when application is connected with the service. Generally the service communicate is done with the help of Service Interface. Service interface defines methods for which service can provider implementation. For example here is some interface: package com.wissen.testApp; public interface IMyService { public int getStatusCode(); } Using this interface the application can ask the Service about its status. Lets see how the service can support this interface. Previously we saw a method called onBind which return IBinder object, the method gets called when some client of the service binds to the service. This is the same object that is passed to the onServiceConnected method. The application can communicate with the service using this IBinder object. Here is how this can be done: public class MyService extends Service { private int statusCode; private MyServiceBinder myServiceBinder = new MyServiceBinder(); @Override public IBinder onBind(Intent intent) { return myServiceBinder; // object of the class that implements Service // interface. } public class MyServiceBinder extends Binder implements IMyService { public int getStatusCode() { return statusCode; } } // ....... } And here is how application can call getStatusCode method: ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { IMyService myService = (IMyService) service; statusCode = myService.getStatusCode(); Log.i("INFO", "Service bound "); } // ........ }; You can also define ServiceListener interface which the client of the service has to be implemented to gets update from the service. In that case the service interface will have to define methods to register and unregister the ServiceListener objects. Communication with Remote Service: The services that we defined until now run in the application processes, you can define service that can run in their own process. For two processes to communicate with each other they need to marshal the object to sent to other process. Android provide an AIDL tool (Android Interface definition Language) to handle all marshalling and communication part. The service has to provide the Service interface as an aidl file. The AIDL tool will create a java interface corresponding for the aidl Service Interface. The AIDL tool also defines a stub class in the generated service interface, which implements the Service Interface (as abstract methods) and also provides some other required functionality. The service interface implementation class has to extend this stub class and define the service interface methods. The service onBind method will return object of this implementation class so that the client application can use the service methods. Here is the how the communication can be done: Create a file as IMyRemoteService.aidl as follows: package com.wissen.testApp; interface IMyRemoteService { int getStatusCode(); } The eclipse android plug-in will create a Java interface for the aidl file created above as the part of build process. The interface generated above will have a Stub inner class. Define a class that extends this stub class. Here is the code for the RemoteService class: package com.wissen.testApp; class RemoteService implements Service { int statusCode; @Override public IBinder onBind(Intent arg0) { return myRemoteServiceStub; } private IMyRemoteService.Stub myRemoteServiceStub = new IMyRemoteService.Stub() { public int getStatusCode() throws RemoteException { return 0; } }; // ........ } When the client application connect to the service the onServiceConnected method will be called and client will get the IBinder object of the service. The Stub class also provides a method to obtain the Service Interface object from the IBinder object. Here is the client onServiceConnected code … ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { IMyRemoteService myRemoteService = IMyRemoteService.Stub .asInterface(service); try { statusCode = myRemoteService.getStatusCode(); } catch (RemoteException e) { // handle exception } Log.i("INFO", "Service bound "); } // ......... }; Permissions: Service may specify required user permissions in the AndroidManifest.xml in <service> tag like this, <service class=".service.MyService" android:permission="com.wissen.permission.MY_SERVICE_PERMISSION"> <intent-filter> <action android:value="com.wissen.testApp.service.MY_SERVICE" /> </intent-filter> </service> Then to use above service the application has to ask for permission with the help of <user-permission> tag as follows: <uses-permission android:name="com.wissen.permission.MY_SERVICE_PERMISSION"></uses-permission> So in today’s post we saw how to create service and use it. In the next post we will see how to use ContentProviders.
2.
AndroidManifest.xml: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.exampleservice" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MainActivity" 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:name=".MyService"></service> </application> <uses-sdk android:minSdkVersion="8" /> </manifest> res\values\strings.xml: <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">ExampleService</string> <string name="service_started">Example Service started</string> <string name="service_label">Example Service Label</string> </resources> res\layout\main.xml: <?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" > <RelativeLayout android:id="@+id/RelativeLayout01" android:layout_width="fill_parent" android:layout_height="wrap_content"> <Button android:id="@+id/btnStart" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Start Service"></Button> <Button android:id="@+id/btnStop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Stop Service" android:layout_alignParentRight="true"></Button> </RelativeLayout> <RelativeLayout android:id="@+id/RelativeLayout02" android:layout_width="fill_parent" android:layout_height="wrap_content"> <Button android:id="@+id/btnBind" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Bind to Service"></Button> <Button android:id="@+id/btnUnbind" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Unbind from Service" android:layout_alignParentRight="true"></Button> </RelativeLayout> <TextView android:id="@+id/textStatus" android:textSize="24sp" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Status Goes Here" /> <TextView android:id="@+id/textIntValue" android:textSize="24sp" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Integer Value Goes Here" /> <TextView android:id="@+id/textStrValue" android:textSize="24sp" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="String Value Goes Here" /> <RelativeLayout android:id="@+id/RelativeLayout03" android:layout_width="fill_parent" android:layout_height="wrap_content"> <Button android:id="@+id/btnUpby1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Increment by 1"></Button> <Button android:id="@+id/btnUpby10" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Increment by 10" android:layout_alignParentRight="true"></Button> </RelativeLayout> </LinearLayout>
src\com.exampleservice\MainActivity.java: src\com.exampleservice\MyService.java:package com.exampleservice;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
Button btnStart, btnStop, btnBind, btnUnbind, btnUpby1, btnUpby10;
TextView textStatus, textIntValue, textStrValue;
Messenger mService = null;
boolean mIsBound;
final Messenger mMessenger = new Messenger(new IncomingHandler());
class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MyService.MSG_SET_INT_VALUE:
textIntValue.setText("Int Message: " + msg.arg1);
break;
case MyService.MSG_SET_STRING_VALUE:
String str1 = msg.getData().getString("str1");
textStrValue.setText("Str Message: " + str1);
break;
default:
super.handleMessage(msg);
}
}
}
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
mService = new Messenger(service);
textStatus.setText("Attached.");
try {
Message msg = Message.obtain(null, MyService.MSG_REGISTER_CLIENT);
msg.replyTo = mMessenger;
mService.send(msg);
} catch (RemoteException e) {
// In this case the service has crashed before we could even do anything with it
}
}
public void onServiceDisconnected(ComponentName className) {
// This is called when the connection with the service has been unexpectedly disconnected - process crashed.
mService = null;
textStatus.setText("Disconnected.");
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnStart = (Button)findViewById(R.id.btnStart);
btnStop = (Button)findViewById(R.id.btnStop);
btnBind = (Button)findViewById(R.id.btnBind);
btnUnbind = (Button)findViewById(R.id.btnUnbind);
textStatus = (TextView)findViewById(R.id.textStatus);
textIntValue = (TextView)findViewById(R.id.textIntValue);
textStrValue = (TextView)findViewById(R.id.textStrValue);
btnUpby1 = (Button)findViewById(R.id.btnUpby1);
btnUpby10 = (Button)findViewById(R.id.btnUpby10);
btnStart.setOnClickListener(btnStartListener);
btnStop.setOnClickListener(btnStopListener);
btnBind.setOnClickListener(btnBindListener);
btnUnbind.setOnClickListener(btnUnbindListener);
btnUpby1.setOnClickListener(btnUpby1Listener);
btnUpby10.setOnClickListener(btnUpby10Listener);
restoreMe(savedInstanceState);
CheckIfServiceIsRunning();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("textStatus", textStatus.getText().toString());
outState.putString("textIntValue", textIntValue.getText().toString());
outState.putString("textStrValue", textStrValue.getText().toString());
}
private void restoreMe(Bundle state) {
if (state!=null) {
textStatus.setText(state.getString("textStatus"));
textIntValue.setText(state.getString("textIntValue"));
textStrValue.setText(state.getString("textStrValue"));
}
}
private void CheckIfServiceIsRunning() {
//If the service is running when the activity starts, we want to automatically bind to it.
if (MyService.isRunning()) {
doBindService();
}
}
private OnClickListener btnStartListener = new OnClickListener() {
public void onClick(View v){
startService(new Intent(MainActivity.this, MyService.class));
}
};
private OnClickListener btnStopListener = new OnClickListener() {
public void onClick(View v){
doUnbindService();
stopService(new Intent(MainActivity.this, MyService.class));
}
};
private OnClickListener btnBindListener = new OnClickListener() {
public void onClick(View v){
doBindService();
}
};
private OnClickListener btnUnbindListener = new OnClickListener() {
public void onClick(View v){
doUnbindService();
}
};
private OnClickListener btnUpby1Listener = new OnClickListener() {
public void onClick(View v){
sendMessageToService(1);
}
};
private OnClickListener btnUpby10Listener = new OnClickListener() {
public void onClick(View v){
sendMessageToService(10);
}
};
private void sendMessageToService(int intvaluetosend) {
if (mIsBound) {
if (mService != null) {
try {
Message msg = Message.obtain(null, MyService.MSG_SET_INT_VALUE, intvaluetosend, 0);
msg.replyTo = mMessenger;
mService.send(msg);
} catch (RemoteException e) {
}
}
}
}
void doBindService() {
bindService(new Intent(this, MyService.class), mConnection, Context.BIND_AUTO_CREATE);
mIsBound = true;
textStatus.setText("Binding.");
}
void doUnbindService() {
if (mIsBound) {
// If we have received the service, and hence registered with it, then now is the time to unregister.
if (mService != null) {
try {
Message msg = Message.obtain(null, MyService.MSG_UNREGISTER_CLIENT);
msg.replyTo = mMessenger;
mService.send(msg);
} catch (RemoteException e) {
// There is nothing special we need to do if the service has crashed.
}
}
// Detach our existing connection.
unbindService(mConnection);
mIsBound = false;
textStatus.setText("Unbinding.");
}
}
@Override
protected void onDestroy() {
super.onDestroy();
try {
doUnbindService();
} catch (Throwable t) {
Log.e("MainActivity", "Failed to unbind from the service", t);
}
}
}
package com.exampleservice;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;
public class MyService extends Service {
private NotificationManager nm;
private Timer timer = new Timer();
private int counter = 0, incrementby = 1;
private static boolean isRunning = false;
ArrayList<Messenger> mClients = new ArrayList<Messenger>(); // Keeps track of all current registered clients.
int mValue = 0; // Holds last value set by a client.
static final int MSG_REGISTER_CLIENT = 1;
static final int MSG_UNREGISTER_CLIENT = 2;
static final int MSG_SET_INT_VALUE = 3;
static final int MSG_SET_STRING_VALUE = 4;
final Messenger mMessenger = new Messenger(new IncomingHandler()); // Target we publish for clients to send messages to IncomingHandler.
@Override
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}
class IncomingHandler extends Handler { // Handler of incoming messages from clients.
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_REGISTER_CLIENT:
mClients.add(msg.replyTo);
break;
case MSG_UNREGISTER_CLIENT:
mClients.remove(msg.replyTo);
break;
case MSG_SET_INT_VALUE:
incrementby = msg.arg1;
break;
default:
super.handleMessage(msg);
}
}
}
private void sendMessageToUI(int intvaluetosend) {
for (int i=mClients.size()-1; i>=0; i--) {
try {
// Send data as an Integer
mClients.get(i).send(Message.obtain(null, MSG_SET_INT_VALUE, intvaluetosend, 0));
//Send data as a String
Bundle b = new Bundle();
b.putString("str1", "ab" + intvaluetosend + "cd");
Message msg = Message.obtain(null, MSG_SET_STRING_VALUE);
msg.setData(b);
mClients.get(i).send(msg);
} catch (RemoteException e) {
// The client is dead. Remove it from the list; we are going through the list from back to front so this is safe to do inside the loop.
mClients.remove(i);
}
}
}
@Override
public void onCreate() {
super.onCreate();
Log.i("MyService", "Service Started.");
showNotification();
timer.scheduleAtFixedRate(new TimerTask(){ public void run() {onTimerTick();}}, 0, 100L);
isRunning = true;
}
private void showNotification() {
nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
// In this sample, we'll use the same text for the ticker and the expanded notification
CharSequence text = getText(R.string.service_started);
// Set the icon, scrolling text and timestamp
Notification notification = new Notification(R.drawable.icon, text, System.currentTimeMillis());
// The PendingIntent to launch our activity if the user selects this notification
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 0);
// Set the info for the views that show in the notification panel.
notification.setLatestEventInfo(this, getText(R.string.service_label), text, contentIntent);
// Send the notification.
// We use a layout id because it is a unique number. We use it later to cancel.
nm.notify(R.string.service_started, notification);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("MyService", "Received start id " + startId + ": " + intent);
return START_STICKY; // run until explicitly stopped.
}
public static boolean isRunning()
{
return isRunning;
}
private void onTimerTick() {
Log.i("TimerTick", "Timer doing work." + counter);
try {
counter += incrementby;
sendMessageToUI(counter);
} catch (Throwable t) { //you should always ultimately catch all exceptions in timer tasks.
Log.e("TimerTick", "Timer Tick Failed.", t);
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (timer != null) {timer.cancel();}
counter=0;
nm.cancel(R.string.service_started); // Cancel the persistent notification.
Log.i("MyService", "Service Stopped.");
isRunning = false;
}
}
发表评论
-
如何用U盘安装 debian linux 系统
2018-03-09 11:03 4368首先下载Win32DiskImager-0.9.5-inst ... -
远程连接云桌面
2018-03-07 15:41 4020http://blog.csdn.net/loyachen/ ... -
hashmap listView
2011-04-10 11:25 4264package com.dev.multicolumn.l ... -
listView 点击发起对话框
2011-01-04 09:46 1874public class ListTaxi extends L ... -
转屏的设置
2010-12-11 09:54 2010@Override public void onCo ... -
列出目录下的所有图片
2010-12-07 11:32 3068public class GalleryTestActivit ... -
listView 多值显示
2010-11-20 17:06 1972<ListView android:id=" ... -
notification Led灯
2010-10-19 18:45 2906public class NotificationUtil ... -
文本从超链接问题Links Using Linkify
2010-10-12 18:00 4856// 没有任何连接 textView.setAutoLink ... -
listView显示选择图片
2010-10-07 11:25 3541public class ItemsList extends ... -
include merge的使用
2010-10-07 10:01 1971root.xml <?xml version=&q ... -
简单旋转
2010-10-06 12:03 1875@Override public void onDra ... -
cygwin安装 android源码下载步骤以及ndk编译
2010-09-25 18:25 3638嘿嘿自己写了个文档 赚点钱花 好下载东西 就不在这里上传了 ... -
title 标题栏字体设置
2010-09-23 16:15 4897<!-- Sets the text styles -- ... -
各种线程总结
2010-09-16 18:58 18141.public void onClick(View v) { ... -
解析xml
2010-09-13 17:34 1361http://www.ibm.com/developerwor ... -
alarm一小时一次
2010-09-12 17:41 2083long firstTime = SystemCloc ... -
imagView有效的加载图片
2010-09-11 12:56 1921((ImageView)view).setImageBitma ... -
新seekBar
2010-09-10 11:03 1849这不是我弄的,是一个论坛里面的 忘了地址了 哪天找到在不上 -
EditText圆角设置
2010-09-06 14:36 5675<?xml version="1.0" ...
相关推荐
进程内Activity和service使用Binder通信
android service使用详解,初步了解service的使用,关注博客 http://himici.com/
Android Service使用,包括Start Service和bind Service启动方式。Service与Acvitity互相传递数据
android service使用的小demo 包括startService stopService bindService unbindService 两种开启、关闭service的小demo
qt-solutions-master 源码和qtservice使用案例工程,包括qtservice,qtbrowserplugin,qtlockedfile,qtpropertybrowser,qtscriptclassic,qtsingleapplication,qtsoap,qtwinmigrate源码qtservice使用案例工程。...
Activity与Service使用Messenger通信简单例子完整源代码。
web service 使用 axis2 框架使用的插件 必不可少的
SQL Server2005 Reporting Service使用的一些总结
同一应用同一进程内部Service使用, service 同一进程内部 同一application内部
service的使用,以及在绑定的service中发送通知
3. 串口服务器设备连接 9 5. IOT 工控云邮件报警功能 35 7. 远程升级 41 1. IOTSERVICE 介绍 2. IOTSERVICE 工具安
Service使用demo
Linux运维-运维课程MP4频-05容器-72dockerswarm网络存储卷-编排部署service使用卷.mp4
Linux运维-运维课程MP4频-05容器-71dockerswarm网络存储卷-手动创建service使用卷.mp4
fontgen-loader, 从SVG图标自动生成 webfont web service使用 ! fontgen-loader - Bam,轻松 webfonts !你遇到了这个你有 4个图标,从FontAwesome到 19,也许你是eying的另一个图标,希望使用它们?真是一团糟行了...
依据Android官方文档,考虑到一些用户不能很好地使用Android设备,比如由于视力、身体、年龄方面的限制,造成阅读内容、触控操作、声音信息等方面的获取困难,因此Android提供了Accessibility特性和服务帮助用户更好...
利用SQL Server 2008自带的Reporting Service服务从简单到复杂的教您建报表 我就用这个学习的
1、使用Service需要在Android Manifest.xml文件中注册Service,如下代码:新建一个普通的class,然后继承Service,那么需
实现Service的启动、停止、绑定、解绑与Service中方法的调用。
演示了Service的各种使用方式,应可供初学者学习。