Androidサービスコンポーネント



Service
概念と用途
:
Androidのサービスは、Activityとは異なり、ユーザーと対話することができず、自分で起動することができず、バックグラウンドで実行されているプログラムです.もし私たちがアプリケーションを終了したとき、Serviceプロセスが終了せず、バックグラウンドで実行されていたら、私たちはいつサービスを使用しますか?例えば私たちが音楽を再生するとき、音楽を聴きながら他のことをしたいかもしれません.音楽を再生するアプリケーションを終了すると、サービスを使わなければ歌が聞こえません.そのため、サービスを使用しなければなりません.例えば、アプリケーションのデータがネットワークを通じて取得された場合、異なる時間(一定時間)のデータが異なる場合は、アプリケーションを開くたびに取得するのではなく、サービスをバックグラウンドでタイミングよく更新できます.
Service
ライフサイクル:
Android ServiceのライフサイクルはActivityほど複雑ではありません.onCreate()、onStart()、onDestroy()の3つのメソッドのみを継承しています.サービスを最初に起動すると、onCreate()、onStart()の2つのメソッドが相次いで呼び出され、サービスを停止するとonDestroy()メソッドが実行されます.ここで注意しなければならないのは、サービスが起動した場合、サービスを再起動すると、onCreate()メソッドを実行するのではなく、onStart()メソッドを直接実行します.具体的には、次の例を参照してください.
Service

Activity
つうしん
:
サービスバックエンドのデータは、最終的にはフロントエンドActivityの上に表示されます.サービスを起動すると、システムは新しいプロセスを再開します.これは異なるプロセス間の通信の問題に関連しています(AIDL)このセクションではあまり説明しません.起動したサービスインスタンスを取得するには、bindServiceとonBindServiceの方法を使用することができます.サービスにおけるIBinder()メソッドとonUnbind()メソッドがそれぞれ実行されます.
サービスのタイプ
 
サービスには2つのタイプがあります.
1.ローカルサービス(Local Service):アプリケーション内
2.リモートサービス(Remote Sece):androidシステム内部のアプリケーション間
前者は、アプリケーションが属するスレッドなどのアプリケーションを占有するのではなく、単一のスレッドバックグラウンドで実行するなど、アップグレード情報のクエリーなど、アプリケーション独自の時間のかかるタスクを実現するために使用されます.これにより、ユーザー体験が向上します.
後者は、天気予報サービスなどの他のアプリケーションに多重化され、他のアプリケーションはこのようなサービスを書く必要がなく、既存のものを呼び出すことができる.
インスタンス1
サービスの作成、起動、停止、バインド方法の説明
プログラムファイル
/Chapter07_Service_Example/src/com/amaker/ch07/app/MainActivity.java

  
  
  
  
  1.  
  2.  
  3. package com.amaker.ch07.app;  
  4.  
  5. import com.amaker.ch07.app.R;  
  6.  
  7. import android.app.Activity;  
  8. import android.app.Service;  
  9. import android.content.ComponentName;  
  10. import android.content.Intent;  
  11. import android.content.ServiceConnection;  
  12. import android.os.Bundle;  
  13. import android.os.IBinder;  
  14. import android.util.Log;  
  15. import android.view.View;  
  16. import android.view.View.OnClickListener;  
  17. import android.widget.Button;  
  18. import android.widget.Toast;  
  19.  
  20. /**  
  21.  *  Service  
  22.  */ 
  23.  
  24. public class MainActivity extends Activity {  
  25.     //  Button  
  26.     private Button startBtn,stopBtn,bindBtn,unbindBtn;  
  27.     @Override  
  28.     public void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         //   
  31.         setContentView(R.layout.main);  
  32.         //  Button  
  33.         startBtn = (Button)findViewById(R.id.startButton01);  
  34.         stopBtn = (Button)findViewById(R.id.stopButton02);  
  35.         bindBtn = (Button)findViewById(R.id.bindButton03);  
  36.         unbindBtn = (Button)findViewById(R.id.unbindButton04);  
  37.           
  38.         //   
  39.         startBtn.setOnClickListener(startListener);  
  40.         stopBtn.setOnClickListener(stopListener);  
  41.         bindBtn.setOnClickListener(bindListener);  
  42.         unbindBtn.setOnClickListener(unBindListener);  
  43.           
  44.     }  
  45.     //  Service  
  46.     private OnClickListener startListener = new OnClickListener() {  
  47.         @Override  
  48.         public void onClick(View v) {  
  49.             //  Intent  
  50.             Intent intent = new Intent();  
  51.             //  Action  
  52.             intent.setAction("com.amaker.ch07.app.action.MY_SERVICE");  
  53.             //  Service  
  54.             startService(intent);  
  55.         }  
  56.     };  
  57.       
  58.     //  Service  
  59.     private OnClickListener stopListener = new OnClickListener() {  
  60.         @Override  
  61.         public void onClick(View v) {  
  62.             //  Intent  
  63.             Intent intent = new Intent();  
  64.             //  Action  
  65.             intent.setAction("com.amaker.ch07.app.action.MY_SERVICE");  
  66.             //  Service  
  67.             stopService(intent);  
  68.         }  
  69.     };  
  70.       
  71.    //   
  72.    private ServiceConnection conn = new ServiceConnection() {  
  73.         @Override  
  74.         public void onServiceConnected(ComponentName name, IBinder service) {  
  75.             Log.i("SERVICE"" !");  
  76.             Toast.makeText(MainActivity.this, " !", Toast.LENGTH_LONG).show();  
  77.         }  
  78.         @Override  
  79.         public void onServiceDisconnected(ComponentName name) {  
  80.             Log.i("SERVICE"" !");  
  81.             Toast.makeText(MainActivity.this, " !", Toast.LENGTH_LONG).show();  
  82.         }  
  83.     };  
  84.       
  85.     // � Service  
  86.     private OnClickListener bindListener = new OnClickListener() {  
  87.         @Override  
  88.         public void onClick(View v) {  
  89.             //  Intent  
  90.             Intent intent = new Intent();  
  91.             //  Action  
  92.             intent.setAction("com.amaker.ch07.app.action.MY_SERVICE");  
  93.            
  94.             //  Service  
  95.             bindService(intent, conn, Service.BIND_AUTO_CREATE);  
  96.         }  
  97.     };  
  98.       
  99.       
  100.     //  Service  
  101.     private OnClickListener unBindListener = new OnClickListener() {  
  102.         @Override  
  103.         public void onClick(View v) {  
  104.             //  Intent  
  105.             Intent intent = new Intent();  
  106.             //  Action  
  107.             intent.setAction("com.amaker.ch07.app.action.MY_SERVICE");  
  108.             //  Service  
  109.             unbindService(conn);  
  110.         }  
  111.     };  
  112.       

 /Chapter07_Service_Example/src/com/amaker/ch07/app/MyService.java
 

  
  
  
  
  1.  
  2.  
  3. package com.amaker.ch07.app;  
  4.  
  5. import android.app.Service;  
  6. import android.content.Intent;  
  7. import android.os.IBinder;  
  8. import android.util.Log;  
  9. import android.widget.Toast;  
  10.  
  11. /**  
  12.  *  Service  
  13.  */ 
  14. public class MyService extends Service{  
  15.       
  16.     //  null, aidl  
  17.     public IBinder onBind(Intent intent) {  
  18.         Log.i("SERVICE""onBind..............");  
  19.         Toast.makeText(MyService.this"onBind..............", Toast.LENGTH_LONG).show();  
  20.         return null;  
  21.     }  
  22.     // Service  
  23.     public void onCreate() {  
  24.         Log.i("SERVICE""onCreate..............");  
  25.         Toast.makeText(MyService.this"onCreate..............", Toast.LENGTH_LONG).show();  
  26.     }  
  27.     //  startService() Service ,  
  28.     public void onStart(Intent intent, int startId) {  
  29.         Log.i("SERVICE""onStart..............");  
  30.         Toast.makeText(MyService.this"onStart..............", Toast.LENGTH_LONG).show();  
  31.     }  
  32.     //  Service  
  33.     public void onDestroy() {  
  34.         Log.i("SERVICE""onDestroy..............");  
  35.         Toast.makeText(MyService.this"onDestroy..............", Toast.LENGTH_LONG).show();  
  36.     }  

レイアウトファイル
/Chapter07_Service_Example/res/layout/main.xml
 

  
  
  
  
  1.  
  2.  
  3. <?xml version="1.0" encoding="utf-8"?>  
  4. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  5.     android:orientation="vertical" 
  6.     android:layout_width="fill_parent" 
  7.     android:layout_height="fill_parent" 
  8.     >  
  9.  
  10.     <Button   
  11.         android:text=" Service"   
  12.         android:id="@+id/startButton01"   
  13.         android:layout_width="wrap_content"   
  14.         android:layout_height="wrap_content"></Button>  
  15.       
  16.     <Button   
  17.         android:text=" Service"   
  18.         android:id="@+id/stopButton02"   
  19.         android:layout_width="wrap_content"   
  20.         android:layout_height="wrap_content"></Button>  
  21.       
  22.     <Button   
  23.         android:text=" Service"   
  24.         android:id="@+id/bindButton03"   
  25.         android:layout_width="wrap_content"   
  26.         android:layout_height="wrap_content"></Button>  
  27.  
  28.     <Button   
  29.         android:text=" "   
  30.         android:id="@+id/unbindButton04"   
  31.         android:layout_width="wrap_content"   
  32.         android:layout_height="wrap_content"></Button>  
  33.  
  34.  
  35. </LinearLayout> 

インベントリファイル
/Chapter07_Service_Example/AndroidManifest.xml
 

  
  
  
  
  1.  
  2.  
  3. <?xml version="1.0" encoding="utf-8"?>  
  4. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  5.       package="com.amaker.ch07.app" 
  6.       android:versionCode="1" 
  7.       android:versionName="1.0">  
  8.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  9.       
  10.         <activity android:name=".MainActivity" 
  11.                   android:label="@string/app_name">  
  12.             <intent-filter>  
  13.                 <action android:name="android.intent.action.MAIN" />  
  14.                 <category android:name="android.intent.category.LAUNCHER" />  
  15.             </intent-filter>  
  16.         </activity>  
  17.           
  18.         <service android:name="MyService">  
  19.             <intent-filter>  
  20.                 <action android:name="com.amaker.ch07.app.action.MY_SERVICE"/>  
  21.             </intent-filter>  
  22.         </service>  
  23.  
  24.     </application>  
  25.     <uses-sdk android:minSdkVersion="3" />  
  26.  
  27. </manifest> 

インスタンス2、リモートサービス呼び出し
インプリメンテーションRPC(remote procedures call)リモートプロセス呼び出し(android interface definition)インタフェース定義言語
 
/Chapter07_Service_Remote/src/com/amaker/ch07/app/MainActivity.java
 

  
  
  
  
  1.  
  2.  
  3. package com.amaker.ch07.app;  
  4.  
  5. import com.amaker.ch07.app.IPerson;  
  6. import com.amaker.ch07.app.R;  
  7.  
  8. import android.app.Activity;  
  9. import android.app.Service;  
  10. import android.content.ComponentName;  
  11. import android.content.Intent;  
  12. import android.content.ServiceConnection;  
  13. import android.os.Bundle;  
  14. import android.os.IBinder;  
  15. import android.os.RemoteException;  
  16. import android.view.View;  
  17. import android.view.View.OnClickListener;  
  18. import android.widget.Button;  
  19. import android.widget.Toast;  
  20. /**  
  21.  *   
  22.  * RPC   
  23.  */ 
  24. public class MainActivity extends Activity {  
  25.     //  IPerson  
  26.     private IPerson iPerson;  
  27.     //   Button  
  28.     private Button btn;  
  29.     //  ServiceConnection  
  30.     private ServiceConnection conn = new ServiceConnection() {  
  31.         @Override 
  32.         synchronized public void onServiceConnected(ComponentName name, IBinder service) {  
  33.             //  IPerson  
  34.             iPerson = IPerson.Stub.asInterface(service);  
  35.             if (iPerson != null)  
  36.                 try {  
  37.                     // RPC   
  38.                     iPerson.setName("hz.guo");  
  39.                     iPerson.setAge(30);  
  40.                     String msg = iPerson.display();  
  41.                     //   
  42.                     Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG)  
  43.                             .show();  
  44.                 } catch (RemoteException e) {  
  45.                     e.printStackTrace();  
  46.                 }  
  47.         }  
  48.  
  49.         @Override 
  50.         public void onServiceDisconnected(ComponentName name) {  
  51.  
  52.         }  
  53.     };  
  54.  
  55.     @Override 
  56.     public void onCreate(Bundle savedInstanceState) {  
  57.         super.onCreate(savedInstanceState);  
  58.         //   
  59.         setContentView(R.layout.main);  
  60.         //  Button  
  61.         btn = (Button) findViewById(R.id.Button01);  
  62.         // Button  
  63.         btn.setOnClickListener(new OnClickListener() {  
  64.             @Override 
  65.             public void onClick(View v) {  
  66.                 //  Intent  
  67.                 Intent intent = new Intent();  
  68.                 //  Intent Action   
  69.                 intent  
  70.                         .setAction("com.amaker.ch09.app.action.MY_REMOTE_SERVICE");  
  71.                 //   
  72.                 bindService(intent, conn, Service.BIND_AUTO_CREATE);  
  73.             }  
  74.         });  
  75.     }  

/Chapter07_Service_Remote/src/com/amaker/ch07/app/MyRemoteService.java
 

  
  
  
  
  1.  
  2.  
  3. package com.amaker.ch07.app;  
  4.  
  5. import android.app.Service;  
  6. import android.content.Intent;  
  7. import android.os.IBinder;  
  8.  
  9. import com.amaker.ch07.app.IPerson.Stub;  
  10.  
  11. /**  
  12.  *  Service  
  13.  */ 
  14. public class MyRemoteService extends Service{  
  15.     //  IPerson  
  16.     private Stub iPerson = new IPersonImpl();  
  17.     @Override 
  18.     public IBinder onBind(Intent intent) {  
  19.         return iPerson;  
  20.     }  

/Chapter07_Service_Remote/src/com/amaker/ch07/app/IPersonImpl.java
 

  
  
  
  
  1.  
  2.  
  3. package com.amaker.ch07.app;  
  4.  
  5. import com.amaker.ch07.app.IPerson;  
  6.  
  7. import android.os.RemoteException;  
  8. /**  
  9.  *   
  10.  * IPerson  
  11.  */ 
  12. public class IPersonImpl extends IPerson.Stub{  
  13.     //   
  14.     private int age;  
  15.     private String name;  
  16.     @Override 
  17.     //  name age  
  18.     public String display() throws RemoteException {  
  19.         return "name:"+name+";age="+age;  
  20.     }  
  21.     @Override 
  22.     //  age  
  23.     public void setAge(int age) throws RemoteException {  
  24.         this.age = age;  
  25.     }  
  26.     @Override 
  27.     //  name  
  28.     public void setName(String name) throws RemoteException {  
  29.         this.name = name;  
  30.     }  

/Chapter07_Service_Remote/src/com/amaker/ch07/app/IPerson.aidl
 

  
  
  
  
  1. package com.amaker.ch07.app;  
  2.  
  3. interface IPerson {  
  4.     void setAge(int age);  
  5.     void setName(String name);  
  6.     String display();  

レイアウトファイル
/Chapter07_Service_Remote/res/layout/main.xml
 

  
  
  
  
  1.  
  2.  
  3. <?xml version="1.0" encoding="utf-8"?> 
  4. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  5.     android:orientation="vertical" 
  6.     android:layout_width="fill_parent" 
  7.     android:layout_height="fill_parent" 
  8.     > 
  9.  
  10.     <Button   
  11.         android:text=" Service"   
  12.         android:id="@+id/Button01"   
  13.         android:layout_width="wrap_content"   
  14.         android:layout_height="wrap_content"></Button> 
  15.  
  16. </LinearLayout> 

インベントリファイル
/Chapter07_Service_Remote/AndroidManifest.xml
 

  
  
  
  
  1.  
  2.  
  3. <?xml version="1.0" encoding="utf-8"?> 
  4. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  5.       package="com.amaker.ch07.app" 
  6.       android:versionCode="1" 
  7.       android:versionName="1.0"> 
  8.     <application android:icon="@drawable/icon" android:label="@string/app_name"> 
  9.         <activity android:name=".MainActivity" 
  10.                   android:label="@string/app_name"> 
  11.             <intent-filter> 
  12.                 <action android:name="android.intent.action.MAIN" /> 
  13.                 <category android:name="android.intent.category.LAUNCHER" /> 
  14.             </intent-filter> 
  15.         </activity> 
  16.           
  17.         <service android:name="MyRemoteService"> 
  18.             <intent-filter> 
  19.                 <action android:name="com.amaker.ch07.app.action.MY_REMOTE_SERVICE"/> 
  20.             </intent-filter> 
  21.         </service> 
  22.  
  23.     </application> 
  24.     <uses-sdk android:minSdkVersion="3" /> 
  25.  
  26. </manifest>