【實驗名稱】實驗四、系結service實驗
【實驗目的】
充分理解Service的作用,與Activity之間的區別,掌握Service的生命周期以及對應函式,了解Service的主執行緒性質;掌握主執行緒的界面重繪的設計原則,掌握啟動service的方式,及其作業原理;
在此實驗中,掌握啟動式和系結式Service之間的原理及區別,了解其性能上的不同,
【實驗內容】
1.在service中實作一個加法函式add(int x,int y)
2.并在Activity界面實作對service方法add的呼叫,實作加法計算,
3.在activity界面上有兩個文本框輸入數字,第三個文本框實作顯示計算結果,一個button實作計算觸發,
【實驗要求】
1、配置service的運行環境以確保service的正確使用
2、熟悉系結service的方式和使用的操作步驟
3、充分理解service的作業原理與其生命周期
(請完成如下部分)
【實驗設計】

下面代碼可運行還有一部分亂數的,讀者自行取需要的叭
MainActivity.java
package com.example.test02;
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 {
Button button;
Button button2;
Button button3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button1);
button2 = (Button) findViewById(R.id.button2);
button3 = (Button) findViewById(R.id.button3);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Intent intent = new Intent(MainActivity.this,DetailActivity.class);
Intent intent = new Intent(MainActivity.this,DetailActivity.class);
intent.putExtra("data","學號:1813004207 姓名:弓明俠 email:1419716628@qq.com");
startActivity(intent);
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, RandomActivity.class);
startActivity(intent);
}
});
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,AddActivity.class);
startActivity(intent);
}
});
}
}
DetailActivity.java
package com.example.test02;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
public class DetailActivity extends Activity {
private SharedPreferences mSpf;
private TextView textView1;
private TextView textView2;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
textView1 = (TextView) findViewById(R.id.text1);
textView2 = (TextView) findViewById(R.id.text2);
//獲取當前頁面接受到的Intent
Intent intent = getIntent();
String msg = intent.getStringExtra("data");
textView1.setText(msg);
//回傳按鈕
Button button =(Button) findViewById(R.id.button2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
//SharedPreferences
mSpf = super.getSharedPreferences("test",MODE_PRIVATE);
}
public void writeInfo(View view) {
SharedPreferences.Editor editor = mSpf.edit();
editor.putString("info",textView1.getText().toString());
editor.commit();
//Toast.makeText(context,"you clicked button 1",Toast.LENGTH_SHORT).show();
}
public void readInfo(View view) {
String info = mSpf.getString("info","");
textView2.setText(info);
}
}
BindService2.java
package com.example.test02;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
public class BindService2 extends Service {
public BindService2() {
}
//創建內部類
public class MyBinder extends Binder{
public BindService2 getService(){
//創建獲取service的方法
return BindService2.this; //回傳當前service
}
}
@Override
public IBinder onBind(Intent intent) {
//回傳MyBinder
return new MyBinder();
}
//自定義方法
public int getSum(int a,int b){
return a+b;
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
AddActivity.java
package com.example.test02;
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.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import androidx.annotation.Nullable;
public class AddActivity extends Activity {
BindService2 binderService;
Button add_button;
TextView result;
EditText num_a;
EditText num_b;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add);
add_button = (Button) findViewById(R.id.add_button);
num_a = (EditText) findViewById(R.id.num_a);
num_b = (EditText) findViewById(R.id.num_b);
result =(TextView) findViewById(R.id.result);
add_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int numa = Integer.parseInt(num_a.getText().toString());
int numb = Integer.parseInt(num_b.getText().toString());
int num = binderService.getSum(numa,numb);
System.out.println(num);
String res = String.valueOf(num);
result.setText(res);
}
});
}
@Override
protected void onStart() {
super.onStart();
Intent intent = new Intent(AddActivity.this,BindService2.class);
bindService(intent,connection,BIND_AUTO_CREATE);
}
//創建connection物件
private ServiceConnection connection = new ServiceConnection() {
/**
* 系結成功后通過getService()獲取Service實體
* 這樣便可以呼叫Service中的方法和屬性
* @param componentName
* @param service
*/
@Override
public void onServiceConnected(ComponentName componentName, IBinder service) {
binderService =((BindService2.MyBinder)service).getService();
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
binderService = null;
}
};
}
RandomActivity.java
package com.example.test02;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.Nullable;
public class RandomActivity extends Activity implements View.OnClickListener{
Button begin;
Button end;
TextView textView;
public static Handler handler;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.service_random);
begin = (Button) findViewById(R.id.begin);
end = (Button) findViewById(R.id.end);
//begin.setOnClickListener(this);
//end.setOnClickListener(this);
textView = (TextView) findViewById(R.id.randomnum);
//顯示啟動
final Intent startIntent = new Intent(RandomActivity.this,RandomService.class);
handler = new Handler(){
@Override
public void handleMessage(Message msg){
System.out.println(msg.what);
textView.setText(String.valueOf(msg.what));
}
};
}
private Intent intent;
@Override
public void onClick(View view) {
begin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
System.out.println("??");
intent = new Intent(RandomActivity.this,RandomService.class);
startService(intent);
}
});
end.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
stopService(intent);
}
});
//兩種方式都可以
/* switch (view.getId()){
case R.id.begin:
System.out.println("??");
intent = new Intent(RandomActivity.this,RandomService.class);
startService(intent);
break;
case R.id.end:
stopService(intent);
break;
default:break;
}*/
}
}
RandomService.java
package com.example.test02;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.Message;
public class RandomService extends Service {
private int random;
private boolean quit=true;
@Override
public void onCreate(){
super.onCreate();
System.out.println("start");
new Thread(){
@Override
public void run(){
while(quit){
random = (int)(Math.random()*100);
Message message = new Message();
message.what = random;
RandomActivity.handler.sendMessage(message);
// System.out.println(random);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId){
return super.onStartCommand(intent,flags,startId);
}
@Override
public void onDestroy(){
quit=false;
super.onDestroy();
System.out.println("stop");
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
}
// private double randomNum;
// private Timer timer=null;
//
// @Nullable
// @Override
// public IBinder onBind(Intent intent) {
// return null;
// }
//
// @Override
// public void onCreate() {
// super.onCreate();
// }
//
// @Override
// public void onStart(Intent intent, int startId) {
// super.onStart(intent, startId);
//
// timer=new Timer();
// timer.schedule(new TimerTask() {
// @Override
// public void run() {
// // (1) 使用handler發送訊息
// Message message=new Message();
// message.what=0;
// mHandler.sendMessage(message);
// }
// },0,1000);//每隔一秒使用handler發送一下訊息,也就是每隔一秒執行一次,一直重復執行
// }
//
//
//
// // (2) 使用handler處理接收到的訊息
// private Handler mHandler = new Handler(){
// @Override
// public void handleMessage(Message msg) {
// if(msg.what == 0){
// //這部分寫要執行的函式
// randomNum = Math.random();
// System.out.println(randomNum);
// }
// }
// };
//
// @Override
// public void onDestroy() {
// super.onDestroy();
// //結束timer
// timer.cancel();
// timer = null;
// }
RandomService2.java
package com.example.test02;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import androidx.annotation.Nullable;
public class RandomService2 extends Service {
private Thread workThread;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
System.out.println("onCreate");
//執行緒組,需要執行的Runnable物件,執行緒的名稱
workThread = new Thread(null,backgroundWork,"WorkThread");
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
if(!workThread.isAlive()){
System.out.println("onStart");
workThread.start();
}
}
@Override
public void onDestroy() {
super.onDestroy();
workThread.interrupt();
}
private Runnable backgroundWork = new Runnable() {
@Override
public void run() {
while(!Thread.interrupted()){
double random = Math.random();
RandomActivity2.UpdateGUI(random);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
}
activity_detail.xml
<?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"
tools:context=".DetailActivity">
<TextView
android:id="@+id/text1"
android:layout_marginTop="30dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button2"
android:layout_marginLeft="30dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="回傳上一頁面" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_marginTop="20dp">
<Button
android:id="@+id/input"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="存盤"
android:onClick="writeInfo"
/>
<Button
android:id="@+id/output"
android:layout_marginLeft="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="讀取"
android:onClick="readInfo"
/>
</LinearLayout>
<TextView
android:id="@+id/text2"
android:layout_marginTop="30dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
activity_main.xml
<?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"
tools:context=".MainActivity">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查看詳細" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="產生亂數頁面"/>
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="執行加法"/>
</LinearLayout>
add.xml
<?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"
tools:context=".AddActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="A: "/>
<EditText
android:id="@+id/num_a"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="B: "/>
<EditText
android:id="@+id/num_b"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="結果: "/>
<TextView
android:id="@+id/result"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:textSize="30dp"
android:text="" />
</LinearLayout>
<Button
android:id="@+id/add_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="計算" />
</LinearLayout>
random2.xml
<?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:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".RandomActivity2">
<TextView
android:id="@+id/num_random2"
android:text="0"
android:textAlignment="center"
android:textSize="200dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal" />
<Button
android:id="@+id/start_random2"
android:text="start"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/stop_random2"
android:text="stop"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
service_random.xml
<?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"
tools:context=".RandomActivity">
<Button
android:id="@+id/begin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="啟動"
/>
<Button
android:id="@+id/end"
android:layout_marginTop="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="結束"
/>
<TextView
android:id="@+id/randomnum"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAlignment="center"
android:textSize="200dp"
android:text="0"
/>
</LinearLayout>
【實驗分析或心得】
充分理解Service的作用,與Activity之間的區別,掌握Service的生命周期以及對應函式,了解Service的主執行緒性質;掌握主執行緒的界面重繪的設計原則,掌握啟動service的方式,及其作業原理,理解了系結式Service,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/245242.html
標籤:其他
上一篇:專案從0開發的流程
下一篇:appium 自動化環境搭建
