Android核心基础(手机卫士的一个知识点总结)(一)

注意:有些功能是需要权限的,在这里并没有写出来,在程序运行中,根据程序报的错误,添加相应的权限即可,里面的具体里面可能有一些小细节,没有明确的写出来,具体的需要在程序中自己调试,解决。

 

 

 

   这个总结涵盖了Android的一些核心的内容,如四大组建Service、ContentProvider、BroadCastReceiver、Activity,而且四大组建都必须在清单文件中注册。

 

    还涉及了Android手机底层的一些功能,如读取联系人、短信等。还有一些看似牛别点技术,什么短息拦截,电话拦截,黑名单拦截,甚至电话窃听、短信窃取(这里只是技术的分享,切不可做违法乱纪之事,否则后果自负)都是可以实现的,只需要在功能中稍加改动就很容实现想要的功能。

 

 

 

1.获取版本号

    思路:

     1.获取包管理器PackageManager

    2.通过包管理器获取包信息PackageInfo

    3.通过包信息获取版本号 packageInfo.VersionName

        PackeageManager p=getPackageMamager();

        PackageInfo info=p.getPackageInfo(getPackageName(),0)

        String version=info.versionName;//获取版本号

 

2.获取网络的连接状态(ConnectivityManager)

    1.获取连接管理器(ConnectivityManager)

    2.通过连接管理器获取网络状态信息的对象(NetworkInfo)

    ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo networkInfo = manager.getActiveNetworkInfo();

    if(networkInfo==null){//没有网络

        return false;

    }else if(networkInfo.getType()==ConnectivityManager.TYPE_MOBILE){//手机2g/3g网络

        return true;

    }else if(networkInfo.getType()==ConnectivityManager.TYPE_WIFI){//wifi网络

        return true;

    }else{

        return false;

    }

 

3.httpClient设置连接超时时间

    client.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 5000);

 

4.textView设置跑马灯效果

    第一种:

         android:ellipsize="marquee"

         android:singleLine="true"

         android:marqueeRepeatLimit="marquee_forever"

         setSelected(true);

    第二种方法是自定义textView 标签名称是自定义类的全类名

         android:ellipsize="marquee"

         android:singleLine="true"

         android:marqueeRepeatLimit="marquee_forever"

         自定义一个类继承子TextView方法,重写isFocused()方法,把返回值置为true

 

5.获取sim卡的串号

    TelephonyManager =getSystemService(Context.Telephony_service)

    pm.getSimSerialerNumber();

 

6.安装sdcard中的apk文件

    // 跳转到安装程序的界面

    Intent intent = new Intent();

    intent.setAction("android.intent.action.VIEW");

    intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");

    startActivity(intent);

 

7.自定义对话框,去掉黑边

    View view = getLayoutInflater().inflate(R.layout.safe_dialog_second,null);

    AlertDialog.Builder builder = new AlertDialog.Builder(this);

    AlertDialog dialog = builder.create();

    dialog.show();

    Window window = dialog.getWindow();

    //通过 window对象弹出的对话框,输入法无法自动弹出,通过下面的设置解决该问题问题

    window.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

    window.setContentView(view);

 

8.ListView分页加载

    1.listview.addFootView(view);

    2.sqlite支持分页查找的功能

       db.query("blackNumber", null, null, null, null, null, null, startId+","+block)

    3.先查找总共有多少条记录,定义开始查找的索引位置,每次加载多少条记录,以及定义一个标记是否加载数据

    4.给listview设置滑动事件

    // 每次滑动都会调用

    public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {

        // 是否滑动到了最后

        if (firstVisibleItem + visibleItemCount == totalItemCount) {

            Log.i("onScroll", "滑动到了最后。。");

            if (!isloading) {// 如果没有加载数据

                //是否滑动到了最后一页

                if (totalItemCount < total) {

                    // 加载数据

                    isloading = true;

                    // 添加Footer

                    lv_black.addFooterView(footView);

                    // 加载数据

                    loadData(totalItemCount);

                }

            }

        }

    }

        

 

9.ListView的优化

    1.定义一个静态类,定义控件的变量

    2.在适配器中的getView()方法通过listview自身的缓存功能

        public View getView(final int position, View convertView,

                ViewGroup parent) {

            ViewHolder holder = null;

            View view;

            if (convertView != null) {

                view = convertView;

                holder = (ViewHolder) convertView.getTag();// 直接从缓存里面取数据

            } else {

                holder = new ViewHolder();

                view = getLayoutInflater().inflate(R.layout.activity_commuicate_lv_item, null);

                holder.tv_number = (TextView) view.findViewById(R.id.tv_number);

                view.setTag(holder);// 把数据控件直接缓存起来,不用每次都来查找控件

            }

            BlackNumberInfo info = infos.get(position);

            holder.tv_number.setText(info.getNumber());

            return view;

        }

            //listview的优化

        private static class ViewHolder {

            TextView tv_number = null;

            TextView tv_type = null;

            ImageView img = null;

        }

 

10.黑名单拦截

    1.启动一个服务,通过TelephonyManager监听电话的到来状态;

    TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

    tm.listen(new PhoneStateListener() {

    switch (state) {

        case TelephonyManager.CALL_STATE_IDLE://电话闲置状态

            break;

        case TelephonyManager.CALL_STATE_RINGING://响铃状态

            // 2.判断来电号码是否是电话黑名单

            boolean black = dao.isPhoneBlack(incomingNumber);

            if (black) {

                //3. 挂断黑名单号码

                endCall(incomingNumber);

                // 挂断电话,但是还有通话记录,所以通过内容监听者,监听内容的改变,一旦发生改变就删除通话记录

                Uri uri = Calls.CONTENT_URI;

                ContentResolver resolver = getContentResolver();

                // 4.注册内容监听者,监听通话记录,并删除通话记录

                resolver.registerContentObserver(uri, true,new MyContentObserver(new Handler(),incomingNumber));

            }

            break;

        case TelephonyManager.CALL_STATE_OFFHOOK://接听状态

            break;

        }

    }

 

11.删除通话记录

    // 通话记录的Uri

    Uri uri = Calls.CONTENT_URI;

    getContentResolver().delete(uri, Calls.NUMBER + "=?",new String[] { inComingNumber });

 

12.挂断电话

    private void endCall(String incomingNumber) {

        //通过反射获取服务管理器,因为底层隐藏了该功能,所以只能通过反射获取挂断电话的方法

        Class<?> clazz = Class.forName("android.os.ServiceManager");

        Method method = clazz.getMethod("getService", String.class);

        IBinder inBinder = (IBinder) method.invoke(null,Context.TELEPHONY_SERVICE);

        ITelephony iTelephony = ITelephony.Stub.asInterface(inBinder);

        iTelephony.endCall();

    }

   注意:

    挂断电话他还依赖于两个aidl文件(ITelephony.aidl和NeighboringCellInfo.aidl)

    ITelephony.aidl文件必须在com.android.internal.telephony该包下

    NeighboringCellInfo.aidl文件必须在android.telephony包下

    包名不能写错,因为这是系统规定好的关于进程间通信的文件,不能随便乱改

 

13.获取联系人

    public static List<ContactInfo> getContacts(ContentResolver cr) {

        //1.首先查询raw_contacts表中联系人的id号

        Cursor cursor = cr.query(Uri.parse("content://com.android.contacts/raw_contacts"),new String[] { "_id" }, null, null, null);

        List<ContactInfo> Contacts = new ArrayList<ContactInfo>();

        //2.遍历所有所有联系人的id

        while (cursor.moveToNext()) {

            int _id = cursor.getInt(0);

            //3.根据联系人的id,获取联系人的信息,data1代表联系人的信息,mimtype是代表信息的类型,如电话,邮件,姓名等

            Cursor contacts_cursor = cr.query(Uri.parse("content://com.android.contacts/raw_contacts/"+ _id + "/data"),new String[]{"data1","mimetype"},null,null,null);

            ContactInfo info = new ContactInfo();

            while (contacts_cursor.moveToNext()) {

                String data = contacts_cursor.getString(0);

                String mimetype = contacts_cursor.getString(1);

                if ("vnd.android.cursor.item/name".equals(mimetype)) {// 姓名

                    info.setName(data);

                } else if ("vnd.android.cursor.item/phone_v2".equals(mimetype)) {// 电话

                    info.setNumber(data);

                }

            }

            Contacts.add(info);

        }

        return Contacts;

    }

 

14.订阅开机广播,判断sim卡是否变更

    1.新建一个类继承自BroadcastReceiver

    2.注册广播,并订阅开启广播  android.intent.action.BOOT_COMPLETED

    3.在onReceiv()方法中取出手机sim的串口,在和首选项(sharedpreference)中的值进行配对

    4.如果不对,就发送短信通知,手机有可能已经丢

 

15.拦截短信到来

    1.新建一个类继承自BroadcastReceiver

    2.注册广播,并订阅接收短信广播 android.provider.Telephony.SMS_RECEIVED

    3.在onReceive()方法中获取短信内容

        Object[] objects = (Object[]) intent.getExtras().get("pdus");

        for (Object object : objects) {

            byte[] sms = (byte[]) object;

            SmsMessage message = SmsMessage.createFromPdu(sms);//创建一个短信对象

            String msg_content = message.getDisplayMessageBody();// 获取信息的内容

            String number = message.getDisplayOriginatingAddress();// 获取发送短信的号码

            //4.中断广播

                abortBroadcast();

            }

        }

    }

 

16.GPS手机定位

    //获取定位管理器

    LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

    //注册地理发生改变事件监听器

    locationManager.requestLocationUpdates(

            LocationManager.GPS_PROVIDER, 0, 0,

            new LocationListener() {

                public void onStatusChanged(String provider,int status, Bundle extras) {}

                public void onProviderEnabled(String provider) {}

                public void onProviderDisabled(String provider) {}

                public void onLocationChanged(Location location) {

                    double longitude = location.getLongitude();// 获取经度值

                    double latitude = location.getLatitude();// 获取纬度

                }

            });

 

17.远程锁屏

    1.拦截短信,根据短信的指令判断是否锁屏

    2.锁屏

        //安全设备管理器

        DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);

        dpm.resetPassword("871405", 0);//设置锁屏密码

        dpm.lockNow();// 锁屏

    3.远程锁屏需要管理员权限,所以要激活管理员权限

        (1)首先要定义一个类继承DeviceAdminReceiver类

           public class MyAdmin extends DeviceAdminReceiver {}

        (2)激活管理员

           //设备安全管理器

           DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);

           // 指定要激活的组件

           ComponentName mDevice = new ComponentName(getApplicationContext(),MyAdmin.class);

           //判断该应用是否有管理员权限

           if(!dpm.isAdminActive(mDeviceAdminSample)){

            Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);

            // 意图里面携带的数据

            intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,mDevice);

            intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,"开启后可以锁定屏幕");

            startActivityForResult(intent, 100);

           }

        (3)需要注册广播

            <receiver

                android:name="liu.li.meng.receiver.MyAdmin"

                android:permission="android.permission.BIND_DEVICE_ADMIN" >

                <meta-data

                android:name="android.app.device_admin"

                android:resource="@xml/device_admin_sample" />

                <intent-filter>

                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />

                </intent-filter>

            </receiver>

        (4)android:resource="@xml/device_admin_sample"依赖一个文件

            <?xml version="1.0" encoding="utf-8"?>

            <device-admin xmlns:android="http://schemas.android.com/apk/res/android">

                <uses-policies>

                <limit-password />

                <watch-login />    

                <reset-password />重置密码 

                <force-lock />锁屏

                <wipe-data />清理数据(恢复出厂设置)

                </uses-policies>

            </device-admin>

 

18.远程清除数据(恢复出厂设置)

    1.拦截短信,根据短信的指令判断是否清理数据

    2.恢复出厂设置(需要管理员权限)

        //设备安全管理器

        DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);

        dpm.wipeData(0);// 清除数据,恢复出厂设置

    3.一样需管理员权限,上面的操作都需要进行设置

 

19.播放报警音乐

    1.拦截短信,根据指令播放播放报警音乐

    2.播放报请音乐

        MediaPlayer mediaPlayer = MediaPlayer.create(context,R.raw.shuai);

        mediaPlayer.setLooping(true);// 循环播放

        mediaPlayer.setVolume(1.0f, 1.0f);// 设置声音最大,即使手机是静音也是最大音量播放

        mediaPlayer.start();

 

20获取SDCard的可用内存,以及手机内置的可用内存

    String sdcardPath = Environment.getExternalStorageDirectory().getAbsolutePath();

    getAvailableMemory(sdcardPath);//获取sdcard可用内存

    String memoryPath = Environment.getDataDirectory().getAbsolutePath();

    getAvailableMemory(memoryPath);//获取手机可用内存

    public String getAvailableMemory(String path) {

        StatFs statFs = new StatFs(path);

        // 获取可用的内存块

        int blocks = statFs.getAvailableBlocks();

        int size = statFs.getBlockSize();

        // 计算可用的内存空间

        int avaiableMemory = blocks * size;

        String dataSize = Formatter.formatFileSize(this, avaiableMemory);//格式化数据

        return dataSize;

    }

转载于:https://my.oschina.net/fltsp/blog/607789

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值