安卓BroadcastReceiver Kill 掉第三方app服务
我用的是vivo y13l 的手机,不知道怎么了,我的应用商店和游戏中心总是偷偷的开启我的数据连接,虽然我的流量每个月都用不完,但是对于用宜搜看小说的我实在不能忍受,用过宜搜的人都知道在有网络连接的时候会弹出广告,每次我把流量关了,结果不到3秒钟就会自动开启了.找了很久的原因才发现是因为应用商店和游戏中心的服务总是自动启动.哪怕在设立里面kill掉也会几秒钟后开启.每次看小说的时候就会调整为飞行模式,特别的不方便..(之前我的手机都不会自动开启数据连接,用了一年半的样子就这样了,各种方法都试了,手机直接双清都没有用.)今天闲着没事,干脆写一个app来监听服务,只要那两个服务开启就kill掉.
- 写一个广播来获取当前的移动网络状态是否开启.wifi我就没有管了
- 再写一个服务来发送广播
- Activity绑定服务,这样的话在我使用那两个app的时候可以关闭监听
MyReceiver广播
先写一个类来继承BroadcastReceiver,我是在设置里面找到了应用商店的包名,所以这里就只写了应用商店的服务.例如:
package com.chen.mob;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.widget.Toast;
public classMyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "发现应用商店自启动,正在kill中", Toast.LENGTH_SHORT).show();
ConnectivityManager connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);// 获取连接管理器
NetworkInfo mobNetInfo = connectivityManager
.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);// 获取移动数据连接
ActivityManager manager = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);// 获取当前开启的服务
if (mobNetInfo.isConnected()) {// 判断是否连接
for (RunningServiceInfo service : manager
.getRunningServices(Integer.MAX_VALUE)) {// 遍历
//System.err.println(service.service.getClassName());//输出服务名称
if("com.bbk.appstore.download.OpenDownloadService"
.equals(service.service.getClassName().toString())) {// 判断是否是应用商店的
manager.killBackgroundProcesses("com.bbk.appstore");// kill掉服务
Toast.makeText(context, "已kill掉应用商店,请手动关闭数据连接",
Toast.LENGTH_SHORT).show();
}
}
}
}
}
MyService服务
然后写一个类来继承Service,例如:
package com.chen.mob;
import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
public classMyService extends Service {
private static boolean falg = true;//是否开启监听的标志
private Handler handler;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
super.onDestroy();
falg = false;//关闭为false
}
@SuppressLint("HandlerLeak")
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
falg = true;//开启为true
new Thread(new Runnable() {//另外开一个线程
@Override
public void run() {
while (falg) {
try {
Thread.sleep(5000);//休眠5秒
handler.sendEmptyMessage(0x101);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (falg) {//如果关闭中断循环
break;
}
}
}
});
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 0x101) {
sendReceiver();//发送广播
}
}
};
return START_STICKY;
}
private void sendReceiver() {
Intent in = new Intent();
in.setAction("edu.jju.broadcastreceiver");
sendBroadcast(in);// 发送普通广播
}
}
Kill
最后写一个activity,例如:
package com.chen.mob;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.Toast;
import android.widget.ToggleButton;
public classKill extends Activity {
private ToggleButton mTogBtn;//开启关闭设置
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTogBtn = (ToggleButton) findViewById(R.id.mTogBtn);//找ID
mTogBtn.setOnCheckedChangeListener(new OnCheckedChangeListener() {//开启关闭监听
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if (isChecked) {
startService(new Intent(Kill.this, MyService.class));//开启绑定服务
} else {
stopService(new Intent(Kill.this, MyService.class));//关闭解除绑定
Toast.makeText(Kill.this, "应用商店kill已关闭", Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
布局文件
<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:background="#f7f8f4"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="@dimen/x40"
android:layout_marginTop="@dimen/x10"
android:background="#fff"
android:orientation="horizontal" >
<Button
android:layout_width="wrap_content"
android:layout_height="@dimen/x40"
android:layout_weight="1"
android:background="#fff"
android:gravity="center_vertical"
android:paddingLeft="@dimen/x8"
android:text="@string/yy" />
<ToggleButton
android:id="@+id/mTogBtn"
android:layout_width="wrap_content"
android:layout_height="@dimen/x40"
android:layout_gravity="center_horizontal"
android:background="@android:color/transparent"
android:button="@drawable/toggle_btn"
android:checked="true"
android:gravity="center_vertical"
android:text=""
android:textOff=""
android:textOn="" />
</LinearLayout>
</LinearLayout>
还有权限设置
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
然后我把它安装在手机上面,启动监听,ok了,应用商店的服务被关闭了.我就可以安心的看小说了.妈妈再也不用担心我关机了
ps:不知道为什么我贴的代码会格式不对,我把public class 类名中间的空格删除就对了.希望能有大神告诉我是为什么哈.