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

2020-06-09  本文已影响0人  SamiraG

源码阅读

#!/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();
    }
}

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中的广播分为两种类型,标准广播和有序广播

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;
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读