魔乐科技安卓开发教程----李兴华----05Service

1.开启、终止服务

1、布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
    android:id="@+id/butstart"
    android:text="start"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

    <Button
        android:id="@+id/butstop"
        android:text="stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

2、创建Service的子类MyService

public class MyService extends Service {
    //绑定服务
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        //暂时不做处理
        return null;
    }

    @Override
    public void onCreate() {
        Log.d("jian", "onCreate: ----");
    }

    @SuppressLint("WrongConstant")
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("jian", "onStartCommand:----- ");

        return Service.START_CONTINUATION_MASK;
    }

    @Override
    public void onDestroy() {
        Log.d("jian", "onDestroy: ---");
    }
}

3、需要配置Manifest文件
添加:

4、主activity文件

public class MainActivity extends AppCompatActivity {
    private Button butstart,butstop;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        butstart=findViewById(R.id.butstart);
        butstop=findViewById(R.id.butstop);

        butstart.setOnClickListener(new StartOnclickListenerImpl());
        butstop.setOnClickListener(new StopOnclickListenerImpl());

    }

    private class StartOnclickListenerImpl implements View.OnClickListener{

        @Override
        public void onClick(View v) {
            startService(new Intent(MainActivity.this,MyService.class));
        }
    }
    private class StopOnclickListenerImpl implements View.OnClickListener{

        @Override
        public void onClick(View v) {
            stopService(new Intent(MainActivity.this,MyService.class));

        }
    }

}

结果是:
2020-03-17 23:48:00.468 6892-6892/com.fengray.myex013service D/jian: onCreate: ----
2020-03-17 23:48:00.469 6892-6892/com.fengray.myex013service D/jian: onStartCommand:-----
2020-03-17 23:48:05.055 6892-6892/com.fengray.myex013service D/jian: onDestroy: —

2.绑定服务

activity和service服务绑定在一起同生共死,通过IBinder接口绑定
1、布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
    android:id="@+id/butstart"
    android:text="start"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

    <Button
        android:id="@+id/butstop"
        android:text="stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/butbind"
        android:text="onbind"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/butunbind"
        android:text="onunbind"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

2、创建MyService类继承自Service

public class MyService extends Service {
    private IBinder myBinder=new Binder(){
        @Nullable
        @Override
        //得到一个接口描述
        public String getInterfaceDescriptor() {
            return "MyService Class";
        }
    };
    //绑定服务
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.d("jian", "onBind: ------");
        //暂时不做处理
        return myBinder;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.d("jian", "onUnbind:-------- ");
        return super.onUnbind(intent);
    }

    @Override
    public void onRebind(Intent intent) {
        Log.d("jian", "onRebind: ----------");
        super.onRebind(intent);
    }

    @Override
    public void onCreate() {
        Log.d("jian", "onCreate: ----");
    }

    @SuppressLint("WrongConstant")
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("jian", "onStartCommand:----- ");

        return Service.START_CONTINUATION_MASK;
    }

    @Override
    public void onDestroy() {
        Log.d("jian", "onDestroy: ---");
    }
}

3、主activity文件

public class MainActivity extends AppCompatActivity {
    private Button butstart,butstop,butBind,butUnbind;
    private ServiceConnection serviceConnection=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            try {
                Log.d("jian", "onServiceConnected: Successful"+service.getInterfaceDescriptor());
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.d("jian", "ServiceDisconnected:fail ");
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        butstart=findViewById(R.id.butstart);
        butstop=findViewById(R.id.butstop);
        butBind=findViewById(R.id.butbind);
        butUnbind=findViewById(R.id.butunbind);

        butstart.setOnClickListener(new StartOnclickListenerImpl());
        butstop.setOnClickListener(new StopOnclickListenerImpl());
        butBind.setOnClickListener(new BindOnclickListenerImpl());
        butUnbind.setOnClickListener(new UnbindOnclickListenerImpl());

    }

    private class StartOnclickListenerImpl implements View.OnClickListener{

        @Override
        public void onClick(View v) {
            startService(new Intent(MainActivity.this,MyService.class));
        }
    }
    private class StopOnclickListenerImpl implements View.OnClickListener{

        @Override
        public void onClick(View v) {
            stopService(new Intent(MainActivity.this,MyService.class));

        }
    }
    private class BindOnclickListenerImpl implements View.OnClickListener{

        @Override
        public void onClick(View v) {
            bindService(new Intent(MainActivity.this,MyService.class), serviceConnection, Context.BIND_AUTO_CREATE);

        }
    }
    private class UnbindOnclickListenerImpl implements View.OnClickListener{

        @Override
        public void onClick(View v) {
            unbindService(serviceConnection);

        }
    }

}

结果是:
2020-03-18 23:37:41.784 14233-14233/com.fengray.myex013service D/jian: onCreate: ----
2020-03-18 23:37:41.784 14233-14233/com.fengray.myex013service D/jian: onBind: ------
2020-03-18 23:37:41.785 14233-14233/com.fengray.myex013service D/jian: onServiceConnected: SuccessfulMyService Class
2020-03-18 23:37:43.780 14233-14233/com.fengray.myex013service D/jian: onUnbind:--------
2020-03-18 23:37:43.780 14233-14233/com.fengray.myex013service D/jian: onDestroy: —

3.绑定服务–解决上例的bug

上例存在如果为启动服务,直接接触绑定(unbind)会产生错误
1、布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/butbind"
        android:text="onbind"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/butunbind"
        android:text="onunbind"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

2、创建MyService类继承Service

public class MyService extends Service {
    private IBinder myBinder=new BinderImpl();

    //绑定服务
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.d("jian", "onBind: ------");
        //暂时不做处理
        return myBinder;
    }
    class BinderImpl extends Binder implements IService{
        public String getInterfaceDescriptor() {
            return "MyService Class";
        }
    }

}

3、创建主activity文件

public class MainActivity extends AppCompatActivity {
    private Button butBind,butUnbind;
    private ServiceConnection serviceConnection=new ServiceConnectionImpl();
    private IService service=null;
    private class  ServiceConnectionImpl implements android.content.ServiceConnection{
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            MainActivity.this.service=(MyService.BinderImpl)service;//将IBinder类对象的子类向下转型到BinderImpl,通过此对象为Service接口实例化

        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.d("jian", "ServiceDisconnected:fail ");
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        butBind=findViewById(R.id.butbind);
        butUnbind=findViewById(R.id.butunbind);


        butBind.setOnClickListener(new BindOnclickListenerImpl());
        butUnbind.setOnClickListener(new UnbindOnclickListenerImpl());

    }


    private class BindOnclickListenerImpl implements View.OnClickListener{

        @Override
        public void onClick(View v) {
            bindService(new Intent(MainActivity.this,MyService.class), serviceConnection, Context.BIND_AUTO_CREATE);

        }
    }
    private class UnbindOnclickListenerImpl implements View.OnClickListener{

        @Override
        public void onClick(View v) {

            if (MainActivity.this.service!=null){

                unbindService(serviceConnection);
                service=null;
            }

        }
    }

}

结果是:
2中的bug解除

4.剪贴板服务

在这里插入图片描述

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //取得服务
        ClipboardManager clipboardManager= (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        clipboardManager.setText("文旅部:暂勿前往疫情严重的国家旅游");
    }
}

结果:
长按实现粘贴文字的效果

5.取得正在运行的activity服务

1、布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView
        android:id="@+id/tasklist"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>

2、Manifest文件中添加permission权限
//android6.0以后可以不用

3、activity文件

public class MainActivity extends AppCompatActivity {
    private ListView tasklist;
    private ListAdapter adapter=null;
    private List<String> all=new ArrayList<>();
    private ActivityManager activityManger=null;
    private List<ActivityManager.RunningTaskInfo> allTaskInfo=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tasklist=findViewById(R.id.tasklist);
        //获得服务
        activityManger= (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        listActivity();
    }

    private void listActivity(){
        allTaskInfo= activityManger.getRunningTasks(30);
        Iterator<ActivityManager.RunningTaskInfo> iteratorInfo=allTaskInfo.iterator();
        while(iteratorInfo.hasNext()){
            ActivityManager.RunningTaskInfo task=iteratorInfo.next();
            all.add("id="+task.id+"--"+task.baseActivity.getClassName());
        }
        adapter=new ArrayAdapter<String>(this,R.layout.support_simple_spinner_dropdown_item,all);
        tasklist.setAdapter(adapter);
    }
}

结果:
在这里插入图片描述

6.绑定服务—取得正在运行的Service进程

1、布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView
        android:id="@+id/tasklist"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>

2、Manifest文件中添加permission权限
//android6.0以后可以不用

3、activity文件

public class MainActivity extends AppCompatActivity {
    private ListView tasklist;
    private ListAdapter adapter=null;
    private List<String> all=new ArrayList<>();
    private ActivityManager activityManger=null;
    private List<ActivityManager.RunningServiceInfo> allServiceInfo=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tasklist=findViewById(R.id.tasklist);
        //获得服务
        activityManger= (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        listActivity();
    }

    private void listActivity(){
        allServiceInfo= activityManger.getRunningServices(30);
        Iterator<ActivityManager.RunningServiceInfo> iteratorInfo=allServiceInfo.iterator();
        while(iteratorInfo.hasNext()){
            ActivityManager.RunningServiceInfo service=iteratorInfo.next();
            all.add("id="+service.pid+"--"+service.process);
        }
        adapter=new ArrayAdapter<String>(this,R.layout.support_simple_spinner_dropdown_item,all);
        tasklist.setAdapter(adapter);
    }
}

结果:
android6以后不知道为什么不显示

7.绑定服务—取得所有运行的应用程序

其他同上两例,activity文件

public class MainActivity extends AppCompatActivity {
    private ListView tasklist;
    private ListAdapter adapter=null;
    private List<String> all=new ArrayList<>();
    private ActivityManager activityManger=null;
    private List<ActivityManager.RunningAppProcessInfo> allServiceInfo=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tasklist=findViewById(R.id.tasklist);
        //获得服务
        activityManger= (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        listActivity();
    }

    private void listActivity(){
        allServiceInfo= activityManger.getRunningAppProcesses();
        Iterator<ActivityManager.RunningAppProcessInfo> iteratorInfo=allServiceInfo.iterator();
        while(iteratorInfo.hasNext()){
            ActivityManager.RunningAppProcessInfo app=iteratorInfo.next();
            all.add("id="+app.pid+"--"+app.processName);
        }
        adapter=new ArrayAdapter<String>(this,R.layout.support_simple_spinner_dropdown_item,all);
        tasklist.setAdapter(adapter);
    }
}

在这里插入图片描述

8.绑定服务—取得手机的网络信息

在以上例子的基础上修改activity文件

public class MainActivity extends AppCompatActivity {
    private ListView mylist = null;
    private ListAdapter adapter = null;
    private List<String> all = new ArrayList<>();
    private TelephonyManager manager = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mylist = findViewById(R.id.mylist);
        //取得电话服务
        manager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        showlist();


    }

    //列出一些信息
    private void showlist() {
        //ActivityCompat.checkSelfPermission(this,Manifest.permission.READ_PHONE_STATE);
        //ActivityCompat.checkSelfPermission(this,Manifest.permission.READ_PHONE_NUMBERS);


        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_NUMBERS) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }
        all.add(manager.getLine1Number() == null ? "没有手机号码" : "手机号码:" + manager.getLine1Number());
        all.add(manager.getNetworkOperatorName()==null?"没有移动服务商":"移动服务商"+manager.getNetworkOperatorName());
        if (manager.getPhoneType()==TelephonyManager.NETWORK_TYPE_CDMA){
            all.add("移动网络:CDMA");
        }else if (manager.getPhoneType()==TelephonyManager.NETWORK_TYPE_GSM){
            all.add("移动网络:GSM" );
        }else{
            all.add("未知网络" );
        }
        adapter=new ArrayAdapter<String>(this,R.layout.support_simple_spinner_dropdown_item,all);
        mylist.setAdapter(adapter);
    }
}

结果:
未能显示,问题出在动态获取权限上。待解。

9.绑定服务—设置wifi状态

1、布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/msg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/openWifi"
        android:text="openWifi"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/closeWifi"
        android:text="closeWifi"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/checkWifi"
        android:text="checkWifi"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>

2、Manifest文件添加权限
as里面会自动添加

3、主activity文件

public class MainActivity extends AppCompatActivity {
    private Button openWifi,closeWifi,checkWifi;
    private TextView msg=null;
    private WifiManager wifiManager=null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        msg=findViewById(R.id.msg);
        openWifi=findViewById(R.id.openWifi);
        closeWifi=findViewById(R.id.closeWifi);
        checkWifi=findViewById(R.id.checkWifi);

        wifiManager= (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);

        openWifi.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                wifiManager.setWifiEnabled(true);//启用wifi
                msg.setText("打开wifi状态"+wifiManager.getWifiState());
            }
        });

        closeWifi.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                wifiManager.setWifiEnabled(false);//启用wifi
                msg.setText("打开wifi状态"+wifiManager.getWifiState());
            }
        });

        checkWifi.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                msg.setText("打开wifi状态"+wifiManager.getWifiState());

            }
        });

    }
}

结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值