美文网首页
每日总结-第四十八天-Android

每日总结-第四十八天-Android

作者: SamiraG | 来源:发表于2020-06-09 23:27 被阅读0次

    源码阅读

    #!/bin/bash
    echo "======start repo sync======"
    repo sync
    while [ $? == 1 ]; do
    echo "======sync failed, re-sync again======"
    sleep 3
    repo sync
    done
    

    http://mirrors.ustc.edu.cn/aosp/platform/manifest.git/refs/heads/

    关于contentprovider涉及到的权限

    package com.ep.testprovider;
    
    import android.content.ContentResolver;
    import android.database.Cursor;
    import android.os.Bundle;
    import android.provider.ContactsContract;
    import android.widget.TextView;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    public class MainActivity extends AppCompatActivity {
        private String columns = ContactsContract.Contacts.DISPLAY_NAME;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            TextView tv = findViewById(R.id.tv);
            String name = getQueryData();
            tv.setText(columns + "\n" + name);
        }
    
        private String getQueryData()
        {
            StringBuilder sb = new StringBuilder();
            ContentResolver resolver = getContentResolver();
            Cursor cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
            int DisplayNameIndex = cursor.getColumnIndex(columns);
            for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext())
            {
                sb.append(cursor.getString(DisplayNameIndex) + "\n");
            }
            return sb.toString();
        }
    }
    
    • 多少app使用了getContentResolverresolver.xxx(URI, ...)
    • Axplorer中对使用了这些URI的API是否进行权限解析

    Intent涉及到的权限

    主要是BroadcastReceiver
    https://www.jianshu.com/p/f348f6d7fe59
    在 Android 系统中,广播(Broadcast)是在组件之间传播数据的一种机制,这些组件可以位于不同的进程中,起到进程间通信的作用

    BroadcastReceiver 是对发送出来的 Broadcast 进行过滤、接受和响应的组件。首先将要发送的消息和用于过滤的信息(Action,Category)装入一个 Intent 对象,然后通过调用 Context.sendBroadcast() 、 sendOrderBroadcast() 方法把 Intent 对象以广播形式发送出去。 广播发送出去后,所以已注册的 BroadcastReceiver 会检查注册时的 IntentFilter 是否与发送的 Intent 相匹配,若匹配则会调用 BroadcastReceiver 的 onReceiver() 方法

    所以当我们定义一个 BroadcastReceiver 的时候,都需要实现 onReceiver() 方法。BroadcastReceiver 的生命周期很短,在执行 onReceiver() 方法时才有效,一旦执行完毕,该Receiver 的生命周期就结束了

    Android中的广播分为两种类型,标准广播和有序广播

    • 标准广播
      标准广播是一种完全异步执行的广播,在广播发出后所有的广播接收器会在同一时间接收到这条广播,之间没有先后顺序,效率比较高,且无法被截断
    • 有序广播
      有序广播是一种同步执行的广播,在广播发出后同一时刻只有一个广播接收器能够接收到, 优先级高的广播接收器会优先接收,当优先级高的广播接收器的 onReceiver() 方法运行结束后,广播才会继续传递,且前面的广播接收器可以选择截断广播,这样后面的广播接收器就无法接收到这条广播了

    1:AndroidManifest.xml 注册广播

    <!--打电话广播-->
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
    <!--监听电话状态-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    
    <receiver android:name=".service.PhoneBroadcastReceiver">
        <intent-filter android:priority="1000">
            //主动打电话时,发送的广播
            <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
            //电话状态改变时,发送的广播 (振铃,挂断,接通)
            <action android:name="android.intent.action.PHONE_STATE"/>
        </intent-filter>
    </receiver>
    

    2:onReceive

    @Override
    public void onReceive(Context context, Intent intent) {
        log.info("收到电话广播:{}", intent == null ? "null" : intent.getAction());
    
        // 如果是拨打电话
        if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
            //拨打电话会优先,收到此广播. 再收到 android.intent.action.PHONE_STATE 的 TelephonyManager.CALL_STATE_OFFHOOK 状态广播;
    
            String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
            log.info("call OUT:{}", phoneNumber);//获取拨打的手机号码
        } else {
            // 如果是来电
            TelephonyManager tManager = (TelephonyManager) context
                    .getSystemService(Service.TELEPHONY_SERVICE);
            //电话的状态
            switch (tManager.getCallState()) {
                case TelephonyManager.CALL_STATE_RINGING:
                    //等待接听状态
                    mIncomingNumber = intent.getStringExtra("incoming_number");
                    log.info("RINGING :" + mIncomingNumber);
                    break;
                case TelephonyManager.CALL_STATE_OFFHOOK:
                    //接听状态
                    break;
                case TelephonyManager.CALL_STATE_IDLE:
                    //挂断状态
                    break;
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:每日总结-第四十八天-Android

          本文链接:https://www.haomeiwen.com/subject/jzestktx.html