Service, tôi không có một thân mình để hiện thị
May 22, 2017 20:57:24 GMT 7
hoichemgio9x and vinhvip like this
Post by Admin on May 22, 2017 20:57:24 GMT 7
Serivce
Service, nếu như bạn đã quen với khái niệm này, nó là một hoạt động ngầm, và không có giao diện người dùng, dùng để thực hiện 1 công việc mà ngay cả khi không cần hiện thị đến, cho khoảng thời gian dài, hoặc là thường xuyên mà không muốn tắt.
Có 2 loại service là hệ thống và ứng dụng người dùng, ứng dụng hệ thống có sẵn dùng để hệ điều hành của android được hoạt động, đáp ứng từng hành động của người dùng,… và dường như giống nhau đối với hệ điều hành android, có một số hãng sản xuất, đưa thêm vào rom của máy những dịch vụ khác mà người dùng không tắt được, cũng được coi là một service hệ thống. Service người dùng, là được các nhà lập trình phần mềm dùng trong ứng dụng của họ, tất nhiên nó sử dụng class Service làm nền tảng và tạo dựng những hoạt động phù hợp với công việc của phần mềm của họ.
Service, không có giao diện, và được khởi động và tắt thông qua liên hệ với 1 ứng dụng cụ thể. Khi ứng dụng tắt, service vẫn chạy ngầm, cho đến khi nó nhận được lệnh kết thúc. Có một số service tự động tắt khi đã hoàn thành xong công việc của nó (IntentService)
Do hoạt động độc lập nên Service cần phải liên lạc với 1 Ứng dụng cụ thể, và hoạt động liên lạc đó được thực hiện qua nhiều kiểu, dưới đây tôi sẽ giới thiệu một cách liên lạc giữa Service và Activity như sau:
Trước hết chúng ta nên biết, Service tương tự như Activity, nó phải được khai báo trong file AndroidManifest.xml
Ở đây tôi dùng Class Service với tên là Svice nên tôi dùng như trên.
Và đây là class Svice.java
Và Class MainActivity.java như sau:
Ta phải viết 2 class Svice.java và class MainActivity.java ở 2 file khác nhau, để chúng đều là public class, một file với không dạng public class thì không thể dùng như 1 Service hay một Activity được.
Trên đây là 1 cách liên lạc giữa Service và Activity, còn có cách khác nhưng có lẽ ta nói sau.
Service, nếu như bạn đã quen với khái niệm này, nó là một hoạt động ngầm, và không có giao diện người dùng, dùng để thực hiện 1 công việc mà ngay cả khi không cần hiện thị đến, cho khoảng thời gian dài, hoặc là thường xuyên mà không muốn tắt.
Có 2 loại service là hệ thống và ứng dụng người dùng, ứng dụng hệ thống có sẵn dùng để hệ điều hành của android được hoạt động, đáp ứng từng hành động của người dùng,… và dường như giống nhau đối với hệ điều hành android, có một số hãng sản xuất, đưa thêm vào rom của máy những dịch vụ khác mà người dùng không tắt được, cũng được coi là một service hệ thống. Service người dùng, là được các nhà lập trình phần mềm dùng trong ứng dụng của họ, tất nhiên nó sử dụng class Service làm nền tảng và tạo dựng những hoạt động phù hợp với công việc của phần mềm của họ.
Service, không có giao diện, và được khởi động và tắt thông qua liên hệ với 1 ứng dụng cụ thể. Khi ứng dụng tắt, service vẫn chạy ngầm, cho đến khi nó nhận được lệnh kết thúc. Có một số service tự động tắt khi đã hoàn thành xong công việc của nó (IntentService)
Do hoạt động độc lập nên Service cần phải liên lạc với 1 Ứng dụng cụ thể, và hoạt động liên lạc đó được thực hiện qua nhiều kiểu, dưới đây tôi sẽ giới thiệu một cách liên lạc giữa Service và Activity như sau:
Trước hết chúng ta nên biết, Service tương tự như Activity, nó phải được khai báo trong file AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.holyeyed.ctrservice"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<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=".Svice"
android:label="my service">
</service>
</application>
</manifest>
Ở đây tôi dùng Class Service với tên là Svice nên tôi dùng như trên.
Và đây là class Svice.java
package com.holyeyed.ctrservice;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
public class Svice extends Service {
mbinder mb = new mbinder();
// biến xét xem đang chạy hay không.
boolean dangchay;
public int onStartCommand(Intent it0, int flag, int id) {
// khi lệnh startService được thực hiện ta cho biến dangchay thành True
dangchay = true;
return Service.START_NOT_STICKY;
}
// lệnh onBind thực hiện khi ta gọi bindService trong Activity
public IBinder onBind(Intent arg0) {
// khi thành công, trả về một giá trị Binder, ở đây ta trả về mbinder.
return mb;
}
public class mbinder extends Binder {
// trả về Class Svice này
public Svice getservice() {
return Svice.this;
}
}
}
Và Class MainActivity.java như sau:
package com.holyeyed.ctrservice;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity implements ServiceConnection, OnClickListener {
//biến nút tắt mở Service
Button bt;
//biến Svice dùng để nhận giá trị từ nó.
Svice sv;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//tạo nút thực hiện lệnh onClick
bt = new Button(this);
bt.setText("hello");
bt.setOnClickListener(this);
setContentView(bt);
}
// lệnh này được thực hiện ngay sau onCreate được thực hiện, hoặc khi
// giao diện được hiện thị lại.
public void onResume() {
super.onResume();
//chúng ta thực hiện lệnh bindService thì bên Service hàm onBind(Intent) được thực thi.
Intent it = new Intent(this, Svice.class);
this.bindService(it, this, this.BIND_AUTO_CREATE);
}
//thực hiện khi kết thúc giao diện
public void onPause() {
super.onPause();
this.unbindService(this);
}
//thực thi khi Service kết nối thành công với Activity, tức là lệnh onBind trả về kết quả
public void onServiceConnected(ComponentName arg0, IBinder mb0) {
//chúng ta lấy ra biến mbinder từ Svice, khi kết nối thành công, đó là giá trị trả về từ hàm onBind(Intent) bên Service
Svice.mbinder mb=(Svice.mbinder)mb0;
//sau đó lấy ra giá trị Svice hiện tại.
sv=mb.getservice();
//thay đổi lệnh nút bấm
if(sv.dangchay){
out("nó đang chạy");
bt.setText("dừng lại");
}else{
out("nó đang tắt");
bt.setText("khởi động");
}
}
//thực thi khi Service kết thúc kết nối tới Activity
public void onServiceDisconnected(ComponentName arg0) {
//không làm gì cả
}
//khi chúng ta nhấn nút thì thực hiện lệnh này
public void onClick(View bt0) {
Intent it=new Intent(this,Svice.class);
//khi Svice đang chạy
if(sv!=null){
if(sv.dangchay){
//nếu đang chạy thì dừng lại
this.stopService(it);
}else{
//ngược lại thì khởi động
this.startService(it);
}
}
}
public void out(Object o){
Toast.makeText(this, ""+o, 1000).show();
}
}
Ta phải viết 2 class Svice.java và class MainActivity.java ở 2 file khác nhau, để chúng đều là public class, một file với không dạng public class thì không thể dùng như 1 Service hay một Activity được.
Trên đây là 1 cách liên lạc giữa Service và Activity, còn có cách khác nhưng có lẽ ta nói sau.