什么是Service
能夠在后臺長時間運行,并且沒有用戶界面的應用程式組件,
Service的分類
StartedService:
通過Activity呼叫startService(),啟動Service
BoundService:
通過Activity呼叫bindService(),啟動后,當activity停止則service停止
service的基本用法
1.創建與配置
package com.example;
import android.app.ActivityManager;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import java.util.ArrayList;
public class MyService extends Service {
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
@Override
public void run() {
int i = 0;
while(isRunning()){//如果Service正在運行
Log.i("Service",String.valueOf(++i));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
//判斷service是否正在運行
public boolean isRunning(){
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
//獲取所有正在運行的Service
ArrayList<ActivityManager.RunningServiceInfo> runningService = (ArrayList<ActivityManager.RunningServiceInfo>);
for (int i = 0; i < runningService.size(); i++) {
if (runningService.service.getClassName.toString.equals("com.example.MyService"))
return true;
}
return false;
}
}
2.啟動和停止
啟動Service:startService()
停止Service
1.由Service呼叫stopSelf()停止
2.由其他組件呼叫stopService()停止
Started Service的生命周期

呼叫startService()->onCreate()->onStartCommand()->Service運行中->
stopSelf()或stopService()->停止Service->onDestroy()->Service被關閉
package com.example;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1 = findViewById(R.id.btn_start);
final Intent intent = new Intent(MainActivity.this,MyService.class);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startService(intent);
}
});
Button button2 = findViewById(R.id.btn_stop);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopService(intent);
}
});
}
}
使用service實作音樂的播放和停止
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:context=".MainActivity">
<Button
android:id="@+id/btn_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放音樂"/>
</LinearLayout>
package com.example;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;
import java.util.ArrayList;
public class MyService extends Service {
static boolean isplay;//記錄當前的播放狀態
MediaPlayer player;
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onCreate() {
//創建MediaPlayer物件,并加載播放的音頻檔案
// player = MediaPlayer.create(this,R.raw.music);
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (!player.isPlaying()){
player.start();//播放音樂
isplay = player.isPlaying();//設定當前狀態為正在播放音樂
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
player.stop();//停止音樂的播放
isplay = player.isPlaying();//設定當前狀態為停止播放音樂
player.release();//釋放資源
super.onDestroy();
}
}
package com.example;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1 = findViewById(R.id.btn_start);
final Intent intent = new Intent(MainActivity.this,MyService.class);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//啟動和停止MusicService
if (MyService.isplay == false){
startService(intent);//啟動service
button1.setText("停止播放音樂");
}else {
stopService(intent);//停止service
button1.setText("啟動播放音樂");
}
}
});
Button button2 = findViewById(R.id.btn_stop);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopService(intent);
}
});
}
@Override
protected void onStart() {
startService(new Intent(MainActivity.this,MyService.class));//啟動service
super.onStart();
}
}
BoundService
Bound Service的生命周期

實作Bound Service的基本步驟
1.創建內部內類MyBinder繼承Binder類,并創建getService()方法回傳service
2.在Service中的onBind()方法中回傳IBinder物件,即回傳創建的內部類MyBinder
3.在Activity中實體化ServiceConnection物件,并重寫其onServiceConnected(),onServiceDisconnected()方法,
在系結成功后回呼onServiceConnected()方法,獲取service物件,
4.在Activity的onStart()方法中使用bindService()方法系結service
5.在Acitivity的onStop()方法中使用unbindService()方法解綁service
使用Bound Service 實作模擬雙色球彩票的隨機選號
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/bg2"
tools:context=".MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="機選號碼"
android:textColor="#BE2020"
android:textSize="26sp"
android:layout_gravity="center"
android:gravity="center"
android:layout_marginTop="50dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp">
<TextView
android:id="@+id/tv_1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#CC0D0D" />
<TextView
android:id="@+id/tv_2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#CC0D0D"
android:layout_marginLeft="5dp"/>
<TextView
android:id="@+id/tv_3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#CC0D0D"
android:layout_marginLeft="5dp"/>
<TextView
android:id="@+id/tv_4"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#CC0D0D"
android:layout_marginLeft="5dp"/>
<TextView
android:id="@+id/tv_5"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#CC0D0D"
android:layout_marginLeft="5dp"/>
<TextView
android:id="@+id/tv_6"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#CC0D0D"
android:layout_marginLeft="5dp"/>
<TextView
android:id="@+id/tv_7"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#CC0D0D"
android:layout_marginLeft="5dp"/>
</LinearLayout>
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="隨機選號"
android:background="#DF2121"/>
</LinearLayout>
package com.example;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class BinderService extends Service {
public BinderService() {
}
//創建MyBinder內部類
public class MyBinder extends Binder{
public BinderService getService(){//創建獲取Service的方法
return BinderService.this;//回傳當前的Service類
}
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return new MyBinder();//回傳MyBinder Service物件
}
//自定義方法,用于生成亂數
public List getRandomNumber(){
List resArr = new ArrayList();
String strNumber = "";//用與保存生成的亂數
for (int i = 0; i < 7; i++) {
int number = new Random().nextInt(33)+1;//生成指定范圍的隨機整數
if (number<10){
strNumber = "0" + String.valueOf(number);
}else {
strNumber = String.valueOf(number);
}
resArr.add(strNumber);//把轉換后的字串添加到Liset集合中
}
return resArr;
}
@Override
public void onDestroy() {//銷毀service
super.onDestroy();
}
}
package com.example;
import androidx.appcompat.app.AppCompatActivity;
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.widget.Button;
import android.widget.TextView;
import java.util.List;
public class MainActivity extends AppCompatActivity {
BinderService binderService;//宣告Service類的物件
int[] tvid = {R.id.tv_1,R.id.tv_2,R.id.tv_3,R.id.tv_4,R.id.tv_5,R.id.tv_6,R.id.tv_7};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn_random = findViewById(R.id.btn);//獲取隨機選號按鈕
btn_random.setOnClickListener(new View.OnClickListener() {//單擊按鈕,獲取隨機彩票號碼
@Override
public void onClick(View v) {
List number = binderService.getRandomNumber();
for (int i = 0; i < number.size(); i++) {
TextView tv = findViewById(tvid[i]);//獲取文本框組件
tv.setText(number.get(i).toString());//顯示生成的隨機號碼
}
}
});
}
//創建serviceConnection物件
private ServiceConnection conn = new ServiceConnection() {
//連接成功回呼此方法
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
binderService = ((BinderService.MyBinder)service).getService();//獲取后臺Service
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onStart() {
super.onStart();
Intent intent = new Intent(MainActivity.this, BinderService.class);
bindService(intent,conn,BIND_AUTO_CREATE);//第三個引數可以設定系結成功后是否自動創建service
}
@Override
protected void onStop() {
super.onStop();
unbindService(conn);
}
}
IntentService的基本用法
為什么要使用IntentService
Service無法自動開啟執行緒來執行耗時任務和自動停止服務,而IntentService可以,
package com.example;
import android.app.IntentService;
import android.content.Intent;
import android.content.Context;
import android.util.Log;
/**
* An {@link IntentService} subclass for handling asynchronous task requests in
* a service on a separate handler thread.
* <p>
* TODO: Customize class - update intent actions, extra parameters and static
* helper methods.
*/
public class MyIntentService extends IntentService {
// TODO: Rename actions, choose action names that describe tasks that this
// IntentService can perform, e.g. ACTION_FETCH_NEW_ITEMS
private static final String ACTION_FOO = "com.example.action.FOO";
private static final String ACTION_BAZ = "com.example.action.BAZ";
// TODO: Rename parameters
private static final String EXTRA_PARAM1 = "com.example.extra.PARAM1";
private static final String EXTRA_PARAM2 = "com.example.extra.PARAM2";
public MyIntentService() {
super("MyIntentService");
}
/**
* Starts this service to perform action Foo with the given parameters. If
* the service is already performing a task this action will be queued.
*
* @see IntentService
*/
// TODO: Customize helper method
public static void startActionFoo(Context context, String param1, String param2) {
Intent intent = new Intent(context, MyIntentService.class);
intent.setAction(ACTION_FOO);
intent.putExtra(EXTRA_PARAM1, param1);
intent.putExtra(EXTRA_PARAM2, param2);
context.startService(intent);
}
/**
* Starts this service to perform action Baz with the given parameters. If
* the service is already performing a task this action will be queued.
*
* @see IntentService
*/
// TODO: Customize helper method
public static void startActionBaz(Context context, String param1, String param2) {
Intent intent = new Intent(context, MyIntentService.class);
intent.setAction(ACTION_BAZ);
intent.putExtra(EXTRA_PARAM1, param1);
intent.putExtra(EXTRA_PARAM2, param2);
context.startService(intent);
}
@Override
protected void onHandleIntent(Intent intent) {
Log.i("IntentService:","Service已啟動");
long endTime = System.currentTimeMillis()+20*1000;//結束時間
while(System.currentTimeMillis()<endTime){
synchronized (this){
try {
wait(endTime-System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
@Override
public void onDestroy() {
Log.i("IntentService:","Service已停止");
super.onDestroy();
}
/**
* Handle action Foo in the provided background thread with the provided
* parameters.
*/
private void handleActionFoo(String param1, String param2) {
// TODO: Handle action Foo
throw new UnsupportedOperationException("Not yet implemented");
}
/**
* Handle action Baz in the provided background thread with the provided
* parameters.
*/
private void handleActionBaz(String param1, String param2) {
// TODO: Handle action Baz
throw new UnsupportedOperationException("Not yet implemented");
}
}
package com.example;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button2 = findViewById(R.id.btn_2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startService(new Intent(MainActivity.this,MyIntentService.class));
}
});
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/218834.html
標籤:AI
上一篇:TextVIew折疊展示
