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());
}
});
}
}
结果: