サービスの基本的な使い方

8373 ワード

  • サービス(Service)は、Androidでプログラムのバックグラウンドで実行されるソリューションです.ユーザーと対話する必要がなく、長期的な実行を求めるタスクを実行するのに適しています.
  • サービスは、独立したプロセスで実行されるのではなく、サービスの作成時に存在するアプリケーションプロセスに依存します.アプリケーション・プロセスが殺されると、そのプロセスに依存するすべてのサービスが停止します.
  • サービスはスレッドを自動的に開くことはなく、すべてのコードはデフォルトでプライマリスレッドで実行されます.すなわち,サービスの内部でサブスレッドを手動で作成し,ここで具体的なタスクを実行する必要がある.

  • 一、サービスの定義
    public class MyService extends Service {
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public void onCreate() {
            super.onCreate();
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            return super.onStartCommand(intent, flags, startId);
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
        }
    }
    
  • **onBind()メソッドは、アクティブおよびサービスの通信に使用されます.
  • **onCreate()**メソッドは、サービス作成時に呼び出されます.
  • **onStartCommand()メソッドは、サービスが開始されるたびに呼び出されます.
  • **onDestroy()**メソッドは、サービス破棄時に呼び出されます.
  • はAndroidManifestにある必要があります.xmlファイルへの登録:
  • 
    ......
        
    ......
            
            
    
        
    
    

    二、サービスの起動と停止
    1.Intentを作成し、アクティビティでstartService()メソッドでサービスを開始します.
    Intent startIntent = new Intent(this, MyService.class);
    startService(startIntent); //     
    
  • サービスはまだ作成されていません.onCreate()、**onStartCommand()**の2つの方法が実行されます.
  • サービスがすでに作成されている場合、*onStartCommand()メソッドのみが実行されます.

  • 2.Intentを作成し、アクティビティでstopService()メソッドでサービスを停止します.
    Intent stopIntent = new Intent(this, MyService.class);
    stopService(stopIntent); //     
    
  • サービスを自分で停止するには、サービスクラスの任意の場所で**stopSelf()メソッドを呼び出すだけです.

  • 三、活動とサービスの通信
    MyServiceでは、
    1.内部クラスの作成MyBinderはBinderから継承され、アクティビティが呼び出す必要がある内容が含まれています.
    2.MyServiceでMyBinderのインスタンスを作成します.
    3.onBind()メソッドでこのインスタンスmBinderを返します.
    public class MyService extends Service {
        private DownloadBinder mBinder = new DownloadBinder();
        class DownloadBinder extends Binder {
            public void startDownload() {
                Log.d("MyService", "startDownload executed");
            }
            public int getProgress() {
                Log.d("MyService", "getProgress executed");
                return 0;
            }
        }
    
        @Override
        public IBinder onBind(Intent intent) {
            return mBinder;
        }
    .....
    }
    

    MainActivity:
    1.ServiceConnectionの匿名クラスインスタンスを作成し、onServiceConnected()メソッドとonServiceDisconnected()メソッドを書き換えます.
  • の2つの方法は、アクティビティがサービスと正常にバインドされ、バインドが解除されたときに呼び出されます.

  • 2.onServiceConnected()メソッドでは、MyBinderのインスタンスをダウンシフトして取得します.
  • には、この例があり、MyBinder内の任意のpublicメソッドをアクティブに特定のシーンに基づいて呼び出すことができる.

  • アクティビティとサービスのバインド:
    1.Intentを作成します.
    2.bindService()メソッドでアクティビティとサービスをバインドします.
  • の最初のパラメータ:Intent.
  • の2番目のパラメータ:ServiceConnectionのインスタンス.
  • の3番目のパラメータ:ここに**BIND_が入力されます.AUTO_CREATE**は、アクティビティとサービスがバインドされた後に自動的にサービスを作成する、すなわちonCreate()メソッドを実行することを示します.

  • 3.unbindService()メソッドでバインドを解除します.
  • パラメータ:ServiceConnectionのインスタンス.
  • public class MainActivity extends Activity implements OnClickListener {
        private Button startService;
        private Button stopService;
        private Button bindService;
        private Button unbindService;
    
        private MyService.DownloadBinder downloadBinder;
    
        private ServiceConnection connection = new ServiceConnection() {
    
            @Override
                public void onServiceDisconnected(ComponentName name) {
            }
    
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                downloadBinder = (MyService.DownloadBinder) service;
                downloadBinder.startDownload();
                downloadBinder.getProgress();
            }
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ......
            bindService = (Button) findViewById(R.id.bind_service);
            unbindService = (Button) findViewById(R.id.unbind_service);
            bindService.setOnClickListener(this);
            unbindService.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                ......
                case R.id.bind_service:
                    Intent bindIntent = new Intent(this, MyService.class);
                    bindService(bindIntent, connection, BIND_AUTO_CREATE); //     
                    break;
                case R.id.unbind_service:
                    unbindService(connection); //     
                    break;
                default:
                    break;
            }
        }
    }
    

    四、サービスのライフサイクル
  • *startService()メソッドを呼び出すと、対応するサービスが開始され、onStartCommand()メソッドがコールバックされます.このサービスがまだ作成されていない場合、onCreate()メソッドはonStartCommand()メソッドより先に実行されます.
  • サービスが開始されると、stopService()または**stopSelf()メソッドが呼び出されるまで稼働状態が維持されます.
  • はまた、**bindService()を呼び出してサービスの永続的な接続を取得することもでき、サービス内のonBind()メソッドがコールバックされます.このサービスがまだ作成されていない場合、onCreate()**メソッドはonBind()**メソッドより先に実行されます.
  • **startService()メソッドを呼び出した後、stopService()メソッドを呼び出すと、サービスのonDestroy()メソッドが実行され、サービスが破棄されたことを示します.
  • *bindService()メソッドが呼び出されると、unbindService()メソッドが呼び出され、onDestroy()メソッドも実行されます.
  • 注意しなければならないのは、1つのサービスに対してstartService()メソッドとbindService()メソッドが呼び出され、1つのサービスが起動されたりバインドされたりした後も、ずっと稼働状態にあり、以上の2つの条件が同時に満たされないようにしなければ、サービスが破棄されないことです.したがって、この場合stopService()メソッドとunbindService()メソッドを同時に呼び出すには、onDestroy()メソッドが実行されます.

  • 五、サービスのもっと多くのテクニック
    1.フロントサービスの利用
  • フロントサービスでは、システムのステータスバーに実行中のアイコンが表示され、ドロップダウンステータスバーの後に通知の効果に非常に似た詳細な情報が表示されます.天気応用のようによく使われます.
  • は、システムメモリ不足のために回収されることなく、サービスが常に稼働状態を維持することを望んでおり、フロントサービスの使用を考慮することができる.
  • Notification.Builder builder = new Notification.Builder(MainActivity.this);
    builder.setSmallIcon(R.drawable.ic_launcher);
    builder.setContentTitle("title");
    builder.setContentText("text");
    builder.setWhen(System.currentTimeMillis()); //     
    
    Intent intent=new Intent(MainActivity.this,Main2Activity.class);
    PendingIntent pi=PendingIntent.getActivity(MainActivity.this,0,intent,PendingIntent.FLAG_CANCEL_CURRENT);
    builder.setContentIntent(pi);
    
    Notification notification = builder.build();
    
    startForeground(1, notification);
    

    使いやすいのは、Notificationメソッドのmanagerを作成することです.notify(1, notification); startForeground(1,notification);.
    2.IntentServiceの使用
  • サービスのコードはすべてデフォルトでメインスレッドで実行されており、サービスで時間のかかる論理を直接処理すれば、ANR(Application Not Responding)が発生しやすい.

  • したがって、
  • は、いくつかの時間のかかる操作に対して、サービス内でサブスレッド実行を開く必要がある.
  • は、サービスが開始されると常にオープン状態になるため、実行が完了すると自動的にサービスが停止することを望む場合もある.このように書くことができます.
  • public class MyService extends Service {
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
    
            new Thread(new Runnable() {
                @Override
                public void run() {
                    //        
                    stopSelf();
                }
            }).start();
    
            return super.onStartCommand(intent, flags, startId);
        }
    }
    
  • 非同期で自動的に停止するサービスを簡単に作成できるように、AndroidはIntentServiceクラスを提供しています.
  • public class MyIntentService extends IntentService {
    
        public MyIntentService() {
            super("MyIntentService"); //            
        }
    
        @Override
        protected void onHandleIntent(Intent intent) {
            //        id
            Log.d("MyIntentService", "Thread id is " + Thread.currentThread().getId());
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            Log.d("MyIntentService", "onDestroy executed");
        }
    }
    
  • は、まず、パラメータのないコンストラクション関数を提供し、その内部で親クラスのパラメータ付きコンストラクション関数を呼び出す必要があります.
  • は、サブスレッドで実行されている**onHandleIntent()という抽象的なメソッドをサブクラスで実装します.
  • InentServiceの機能に従って、このサービスは実行終了後に自動的に停止するはずです.すなわち、**onDestroy()メソッドを実行します.