zoukankan      html  css  js  c++  java
  • Service代码示例

     1 package com.homily.training.service;
     2 
     3 import android.app.Service;
     4 import android.content.Intent;
     5 import android.os.Binder;
     6 import android.os.IBinder;
     7 import android.support.annotation.Nullable;
     8 import android.util.Log;
     9 
    10 import com.homily.training.test.service.ICallbackResult;
    11 
    12 /**
    13  * Created by Rubert on 2016/7/6.
    14  */
    15 public class BindService extends Service{
    16 
    17     private final static String TAG = BindService.class.getSimpleName();
    18 
    19     private MBinder mMBinder;
    20     private ICallbackResult mICallbackResult;
    21     private boolean unBindTarget = false;
    22 
    23 
    24     @Nullable
    25     @Override
    26     public IBinder onBind(Intent intent) {
    27         Log.i(TAG, "============onBind==================");
    28         return mMBinder;
    29     }
    30     @Override
    31     public void onCreate() {
    32         super.onCreate();
    33         Log.i(TAG, "============onCreate==================");
    34         mMBinder = new MBinder();
    35     }
    36 
    37     @Override
    38     public int onStartCommand(Intent intent, int flags, int startId) {
    39         Log.i(TAG, "============onStartCommand==================");
    40         return super.onStartCommand(intent, flags, startId);
    41     }
    42 
    43     @Override
    44     public void onDestroy() {
    45         unBindTarget = true;
    46         super.onDestroy();
    47         Log.i(TAG, "============onDestroy==================");
    48     }
    49 
    50     @Override
    51     public boolean onUnbind(Intent intent) {
    52         Log.i(TAG, "============onUnbind==================");
    53         unBindTarget = true;//该处代码需要这么写是因为,Service中开启了线程。如果该Service直接onUnbind了,但是线程没有停止,并且如果再次bind该Service时,程序会再次重新实例化一个线程,并之前的线程也会一直运行下去,除非该app销毁。
    54         return super.onUnbind(intent);
    55     }
    56 
    57     public class MBinder extends Binder {
    58         public void start(){
    59             Log.i(TAG, "============MBinder-start==================");
    60             new Thread(new Runnable() {
    61                 @Override
    62                 public void run() {
    63 
    64                     while (true) {
    65                         if(unBindTarget) {
    66                             break;
    67                         }
    68                         Log.i(TAG, Thread.currentThread().getName() + "============MBinder-start-run==================");
    69                         mICallbackResult.OnBackResult(null);
    70                         try {
    71                             Thread.currentThread().sleep(5000);
    72                         } catch (InterruptedException e) {
    73                             e.printStackTrace();
    74                         }
    75                     }
    76                 }
    77             }).start();
    78         }
    79 
    80         public void bind(ICallbackResult result) {
    81             mICallbackResult = result;
    82         }
    83 
    84     }
    85 
    86 
    87 }
     1 package com.homily.training.service;
     2 
     3 import android.app.Service;
     4 import android.content.Intent;
     5 import android.os.IBinder;
     6 import android.support.annotation.Nullable;
     7 import android.util.Log;
     8 
     9 /**
    10  * Created by Rubert on 2016/7/6.
    11  */
    12 public class StartService extends Service{
    13 
    14     private final static String TAG = StartService.class.getSimpleName();
    15 
    16     @Nullable
    17     @Override
    18     public IBinder onBind(Intent intent) {
    19         Log.i(TAG, "============onBind==================");
    20         return null;
    21     }
    22 
    23     @Override
    24     public void onCreate() {
    25         super.onCreate();
    26         Log.i(TAG, "============onCreate==================");
    27     }
    28 
    29     @Override
    30     public int onStartCommand(Intent intent, int flags, int startId) {
    31         Log.i(TAG, "============onStartCommand==================");
    32         return super.onStartCommand(intent, flags, startId);
    33     }
    34 
    35     @Override
    36     public void onDestroy() {
    37         super.onDestroy();
    38         Log.i(TAG, "============onDestroy==================");
    39     }
    40 
    41     @Override
    42     public boolean onUnbind(Intent intent) {
    43         Log.i(TAG, "============onUnbind==================");
    44         return super.onUnbind(intent);
    45     }
    46 }
     1 package com.homily.training.test.service;
     2 
     3 import android.app.Activity;
     4 import android.content.ComponentName;
     5 import android.content.Context;
     6 import android.content.Intent;
     7 import android.content.ServiceConnection;
     8 import android.os.Binder;
     9 import android.os.Bundle;
    10 import android.os.IBinder;
    11 import android.util.Log;
    12 import android.view.View;
    13 import android.widget.Button;
    14 
    15 import com.homily.training.R;
    16 import com.homily.training.service.BindService;
    17 import com.homily.training.service.StartService;
    18 
    19 /**
    20  * Created by Rubert on 2016/7/6.
    21  * 主要验证startService 启动后再次启动;以及bindService绑定后,解绑再次绑定的情况。
    22  */
    23 public class ServiceMainAct extends Activity implements View.OnClickListener{
    24 
    25     private final static String TAG = ServiceMainAct.class.getSimpleName();
    26 
    27     Button startServiceBtn;
    28     Button closeServiceBtn;
    29     Button bindServiceBtn;
    30     Button unbindServiceBtn;
    31     BindService.MBinder mMBinder;
    32     boolean IsBinder = false;
    33 
    34     @Override
    35     protected void onCreate(Bundle savedInstanceState) {
    36         super.onCreate(savedInstanceState);
    37         setContentView(R.layout.service_layout);
    38         startServiceBtn = (Button)findViewById(R.id.startService);
    39         closeServiceBtn = (Button)findViewById(R.id.closeService);
    40         bindServiceBtn = (Button)findViewById(R.id.binService);
    41         unbindServiceBtn = (Button)findViewById(R.id.unbinService);
    42 
    43         startServiceBtn.setOnClickListener(this);
    44         closeServiceBtn.setOnClickListener(this);
    45         bindServiceBtn.setOnClickListener(this);
    46         unbindServiceBtn.setOnClickListener(this);
    47     }
    48 
    49 
    50 
    51     ServiceConnection mConnection = new ServiceConnection(){
    52         @Override
    53         public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
    54             Log.i(TAG, "=============onServiceConnected==================");
    55             mMBinder = (BindService.MBinder)iBinder;
    56             mMBinder.bind(mICallbackResult);
    57             mMBinder.start();
    58             IsBinder = true;
    59         }
    60         @Override
    61         public void onServiceDisconnected(ComponentName componentName) {
    62             Log.i(TAG, "=============onServiceDisconnected==================");
    63             IsBinder = false;
    64         }
    65     };
    66 
    67     ICallbackResult mICallbackResult = new ICallbackResult(){
    68         @Override
    69         public void OnBackResult(Object result) {
    70             Log.i(TAG, "=============result==================");
    71         }
    72     };
    73 
    74     @Override
    75     public void onClick(View view) {
    76         switch (view.getId()) {
    77             case R.id.startService:
    78                 Intent sintent = new Intent(ServiceMainAct.this, StartService.class);
    79                 startService(sintent);
    80                 break;
    81             case R.id.closeService:
    82                 Intent cintent = new Intent(ServiceMainAct.this, StartService.class);
    83                 stopService(cintent);
    84                 break;
    85             case R.id.binService:
    86                 Intent service = new Intent(ServiceMainAct.this, BindService.class);
    87                 bindService(service, mConnection, Context.BIND_AUTO_CREATE);
    88                 break;
    89             case R.id.unbinService:
    90                 if(mConnection != null && IsBinder)
    91                 unbindService(mConnection);
    92                 break;
    93         }
    94 
    95     }
    96 
    97 
    98 
    99 }
    1 package com.homily.training.test.service;
    2 
    3 /**
    4  * Created by Rubert on 2016/7/6.
    5  */
    6 public interface ICallbackResult {
    7     void OnBackResult(Object result);
    8 }
    <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
    
            <service android:name="com.homily.training.service.StartService" />
            <service android:name="com.homily.training.service.BindService" />
        
    <activity android:name=".test.service.ServiceMainAct">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    </application>
     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     android:orientation="vertical"
     6     >
     7 
     8     <Button
     9         android:id="@+id/startService"
    10         android:layout_width="match_parent"
    11         android:layout_height="wrap_content"
    12         android:text="startService"
    13         />
    14     <Button
    15         android:id="@+id/closeService"
    16         android:layout_width="match_parent"
    17         android:layout_height="wrap_content"
    18         android:text="closeService"
    19         />
    20 
    21     <Button
    22         android:id="@+id/binService"
    23         android:layout_width="match_parent"
    24         android:layout_height="wrap_content"
    25         android:text="binService"
    26         />
    27     <Button
    28         android:id="@+id/unbinService"
    29         android:layout_width="match_parent"
    30         android:layout_height="wrap_content"
    31         android:text="unbinService"
    32         />
    33 
    34 </LinearLayout>
    Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,然后在onStartCommand方法中做一些处理。然后我们注意到这个函数有一个int的返回值,这篇文章就是简单地讲讲int返回值的作用。
    从Android官方文档中,我们知道onStartCommand有4种返回值:
     
    START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
     
    START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
     
    START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
     
    START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
  • 相关阅读:
    我的WCF之旅(1):创建一个简单的WCF程序
    与众不同 windows phone (15) Media(媒体)之后台播放音频
    与众不同 windows phone (14) Media(媒体)之音频播放器, 视频播放器, 与 Windows Phone 的音乐和视频中心集成
    与众不同 windows phone (10) Push Notification(推送通知)之推送 Tile 通知, 推送自定义信息
    与众不同 windows phone (17) Graphic and Animation(画图和动画)
    与众不同 windows phone (5) Chooser(选择器)
    与众不同 windows phone (26) Contacts and Calendar(联系人和日历)
    与众不同 windows phone (7) Local Database(本地数据库)
    与众不同 windows phone (19) Device(设备)之陀螺仪传感器, Motion API
    与众不同 windows phone (16) Media(媒体)之编辑图片, 保存图片到相册, 与图片的上下文菜单“应用程序...”和“共享...”关联, 与 Windows Phone 的图片中心集成
  • 原文地址:https://www.cnblogs.com/royi123/p/5646918.html
Copyright © 2011-2022 走看看