服务的创建,绑定以及调用服务中的方法(以应用锁为例)
来源:互联网 发布:让其响彻 动作数据 编辑:程序博客网 时间: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
- 服务的创建,绑定以及调用服务中的方法(以应用锁为例)
- 绑定服务:调用远程服务中的方法
- 绑定服务并调用服务中的方法
- 绑定服务调用本地服务中的方法
- 绑定服务调用远程服务中的方法
- activity以绑定服务的方式开启服务并调用服务里面的方法
- 绑定服务&调用服务里面的方法
- 绑定服务:调用服务内部的方法
- andorid,绑定服务,调用服务的方法
- Android--绑定服务调用服务的方法
- 绑定服务并调用服务的方法,解除绑定
- 绑定的方式调用服务的方法
- 绑定服务调用方法的回顾
- android,aidl,绑定远程服务,调用远程服务的方法
- android之绑定服务调用服务的方法
- Android绑定方式开始服务&调用服务当中的方法
- Android启动服务和绑定服务的方法调用
- 一个通过JSONP跨域调用WCF REST服务的例子(以jQuery为例)
- FlowLayout,流式布局
- 二维数组中的查找
- google chrome:版本列表
- 二重积分的计算 —— 交换积分顺序(exchange the order of integration)
- CSS中将图片居中显示小技巧
- 服务的创建,绑定以及调用服务中的方法(以应用锁为例)
- linux使用grep命令根据字符串查询日志中关键词出现的位置
- usb audio --异步反馈的实现(3)
- MyBatis
- 拉电流(source current)与灌电流(sink current)
- 深入理解实参和形参
- eclipse中创建JUnit简单实例
- 用IDEA开发简单的Servlet
- SVN自动生成文件目录filelist清单及文件搜索功能实现