• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

【安卓实验】实验四、绑定service实验 & 加法函数add

互联网 diligentman 3个月前 (01-06) 34次浏览

【实验名称】实验四、绑定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的工作原理与其生命周期

(请完成如下部分)
【实验设计】
【安卓实验】实验四、绑定service实验 & 加法函数add

下面代码可运行还有一部分随机数的,读者自行取需要的叭

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。


程序员灯塔
转载请注明原文链接:【安卓实验】实验四、绑定service实验 & 加法函数add
喜欢 (0)