服务的创建,绑定以及调用服务中的方法(以应用锁为例)

来源:互联网 发布:让其响彻 动作数据 编辑:程序博客网 时间:2024/05/18 01:37

1.创建一个接口,会被继承Binder类的类所实现,在活动中调用的也是该接口中的方法

package com.songyan.applock;public interface IService {    void startApp(String packageName);    void stopApp(String packageName);}

2.定义服务

package com.songyan.applock;import android.app.ActivityManager;import android.app.ActivityManager.RunningTaskInfo;import android.app.KeyguardManager;import android.app.Service;import android.content.Intent;import android.database.ContentObservable;import android.database.ContentObserver;import android.net.Uri;import android.os.Binder;import android.os.Handler;import android.os.IBinder;import android.provider.Settings;import android.support.annotation.Nullable;import android.util.Log;import java.util.ArrayList;import java.util.List;public class WatchDogService extends Service{    private AppLockDao dao;    private List<String> apps;    //存放要停止保护的app    private List<String> stopApps;    private ActivityManager activityManager;    private Intent intent;    private boolean flag=true;    private MyBinder myBinder;    //键盘的管理器    private KeyguardManager keyguardManager;    //在服务中定义的具体方法,临时开启对某个应用的保护    private void invokeMethodStartApp(String packageName){        if(stopApps.contains(packageName)){            stopApps.remove(packageName);        }    }    //临时停止对某个应用的保护    private void invokeMethodStopApp(String packageName){        stopApps.add(packageName);    }    //实现继承Binder类并实现IService接口的类,会在onBind方法中返回该类的对象    private class MyBinder extends Binder implements IService{        @Override        public void startApp(String packageName) {            //在IService接口的方法中引用服务的具体方法            invokeMethodStartApp(packageName);        }        @Override        public void stopApp(String packageName) {            invokeMethodStopApp(packageName);        }    }    @Nullable    @Override    public IBinder onBind(Intent intent) {        //返回在onCreate中初始化的MyBinder对象        return myBinder;    }    @Override    public void onCreate() {        super.onCreate();        keyguardManager=(KeyguardManager)getSystemService(Service.KEYGUARD_SERVICE);        Log.d("songyandebug","service start");        dao=new AppLockDao(this);        apps=dao.getAllPackageName();        stopApps=new ArrayList<>();        myBinder=new MyBinder();//初始化MyBinder类的对象        activityManager=(ActivityManager)getSystemService(Service.ACTIVITY_SERVICE);        //注册一个内容观察者        getContentResolver().registerContentObserver(                Uri.parse("content://com.songyan.applock.applockprovider"),                true,new MyObserver(new Handler()));        //MyObserver就是数据库发生变化以后会执行的内容        intent=new Intent(this,LockActivity.class);        //服务里面是没有任务栈的,所以要指定一个新的任务栈,不然是无法在服务里面启动activity的        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        new Thread()        {            public void run(){                while(flag){                    try{                        //得到当前运行的任务栈,参数就是得到多少个任务栈,1就是只拿一个任务栈                        //1对应的也就是正在运行的任务栈啦                        Log.d("songyandebug","service run execute");                        for(String app:apps){                            Log.d("songyandebug","get packageName:"+app);                        }                        List<RunningTaskInfo> runningTaskInfos=activityManager.getRunningTasks(1);                        //拿到当前运行的任务栈                        RunningTaskInfo runningTaskInfo=runningTaskInfos.get(0);                        //拿到要运行的Activity的包名                        String packageName=runningTaskInfo.topActivity.getPackageName();                        Log.d("songyandebug","top runningTask is:"+packageName);                        if(apps.contains(packageName)){                            Log.d("songyandebug","service run execute2");                            intent.putExtra("packageName",packageName);                            startActivity(intent);                            //stopSelf();                        }else{                        }                        sleep(1000);                    }catch (InterruptedException e){                        e.printStackTrace();                    }                }            }        }.start();    }    @Override    public void onDestroy() {        super.onDestroy();        flag=false;    }    private class MyObserver extends ContentObserver{        public MyObserver(Handler handler){            super(handler);            //重新更新apps里面的内容            apps=dao.getAllPackageName();            Log.d("songyan","数据库的内容发生了变化");        }    }}
3.绑定和调用服务中的方法

package com.songyan.applock;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.content.pm.ApplicationInfo;import android.graphics.drawable.Drawable;import android.os.Bundle;import android.os.IBinder;import android.text.TextUtils;import android.view.KeyEvent;import android.view.View;import android.view.Window;import android.widget.EditText;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;public class LockActivity extends Activity{    private ImageView iv_app_icon;    private TextView tv_app_name;    private EditText et_app_pwd;    private String password;    private Intent serviceIntent;    private MyConnection connection;    private IService iService;    private String packageName;    //绑定服务和调用服务里面的方法需要的内部类    private class MyConnection implements ServiceConnection{        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            //服务中onBind方法返回的对象实现了IService接口            iService=(IService)service;        }        @Override        public void onServiceDisconnected(ComponentName name) {        }    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.lock);        iv_app_icon=(ImageView)findViewById(R.id.iv_app_lock_icon);        tv_app_name=(TextView)findViewById(R.id.tv_lock_app_name);        et_app_pwd=(EditText)findViewById(R.id.et_lock_pwd);        password="123456";//这里先随便设置一个密码        try{            packageName=getIntent().getStringExtra("packageName");            ApplicationInfo appInfo=getPackageManager().getPackageInfo(packageName,0).applicationInfo;            Drawable app_icon=appInfo.loadIcon(getPackageManager());            String app_name=appInfo.loadLabel(getPackageManager()).toString();            iv_app_icon.setImageDrawable(app_icon);            tv_app_name.setText(app_name);        }catch (Exception e){            e.printStackTrace();        }        //绑定服务,主要是为了能够调用服务里面的方法        connection=new MyConnection();        Intent intent=new Intent(this,WatchDogService.class);        bindService(intent,connection, Context.BIND_AUTO_CREATE);    }    public void confirm(View v){        String input=et_app_pwd.getText().toString().trim();        if(TextUtils.isEmpty(password)){            Toast.makeText(this,"您的密码还没有设置",Toast.LENGTH_SHORT).show();        }else if(TextUtils.isEmpty(input)){            Toast.makeText(this,"密码不能为空",Toast.LENGTH_SHORT).show();        }else if(password.equals(input)){            finish();//结束这个Activity            //调用服务里面的方法            iService.stopApp(packageName);        }else{            Toast.makeText(this,"密码错误",Toast.LENGTH_SHORT).show();        }    }    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {        //屏蔽后退键        if(KeyEvent.KEYCODE_BACK==event.getKeyCode()){            return true;//阻止事件继续向上分发        }        return super.onKeyDown(keyCode, event);    }    @Override    protected void onStop() {        super.onStop();        //调用服务里面的方法        iService.startApp(packageName);    }    @Override    protected void onDestroy() {        if(connection!=null){            //解除服务绑定            unbindService(connection);            connection=null;        }        super.onDestroy();    }}

最后不要忘记在AndroidManifest.xml文件中对服务进行注册,不然服务不会启动。

阅读全文
0 0
原创粉丝点击