天天看点

Android基础知识开机广播拦截 ##

解析JSON数据

把json格式的字符串 生成一个JSONObject对象
JSONObject jo = new JSONObject(result);
           

设置更新的弹出框:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
这里一定要传this。
builder.show();
           

SD卡的判断

Environment.getExternalStorageDirectory()    获取SD卡的私有目录
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))  判断是否有SD卡
           

设置进度条,及设置样式

ProgressDialog pd = new ProgressDialog(this);// 更新进度条
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);// 设置进度条样式为横向
pd.setMax(int);   pd.setProgress(int);
pd.show();  pd.dismiss();
           

Dialog构造函数传的是activity.this dialog依赖于activity界面生命周期随着activity的消失而消失

Toast可以传getApplicationContext();

去掉应用所有页面的标题栏

<style name="AppTheme" parent="AppBaseTheme">
     <item name="android:windowNoTitle">true</item>
</style>

android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen"
Theme.Light  Theme.Black 都是旧的样式
Theme.holo开头的是新的样式了
           

GridView的使用

<GridView
    android:id="@+id/gv_home"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:horizontalSpacing="2dp"          //条目之间的横向间隔距离
    android:numColumns="2"                   //列的数量
    android:verticalSpacing="2dp" />         //条目之间的竖直方向间隔距离
           

自定义组合控件:

获取所有控件
TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.SettingItemView);
String title = typedArray.getString(R.styleable.SettingItemView_SiTitle);
    SettingItemView_SiTitle是自定义类名__布局中设置的属性
           

自定义dialog布局

AlertDialog.Builder bulder = new AlertDialog.Builder(this);
View view = View.inflate(this, R.layout.dialog_sjfd_initpsw, null);
bulder.setView(view);
AlertDialog dialog = bulder.create();
dialog.show();
           

Activity的跳转动画

参数需要在res下创建xml文件(Tween Animation>>translate)
overridePendingTransition(R.anim.next_enter, R.anim.next_exit);
           

getRawX()和getX()区别: ##

如果我们是重写的activity的onTouchEvent(MotionEvent event) 那么event.getX()和event.getRawX()的值是相同的
>如果给一个view(比如一个button) 设置setOnTouchListener 
xxx.setOnTouchListener(new OnTouchListener() {

@Override
public boolean onTouch(View v, MotionEvent event) {
    System.out.println("onTouch.getRawY()==" + event.getRawY());
    System.out.getRawY()("onTouch.getY()==" + event.getY());
    //这里的getRawX()和getRawY()的到的坐标是相对于整个手机屏幕的左上角
    //这里的getX()和getY()的到的坐标是相对于当前控件(就是xxx)的左上角,坐标值不会 超出控件的宽和高
    return true;
    }
});
           

开机广播拦截 ##

  • 接收开启广播的权限 不加不会报错 但会接收不到广播
    <receiver android:name="com.itheima.mobilesafe91.receiver.BootCompleteReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
      </receiver>
               

广播的发送

sendBroadcast(intent);  发送无序广播
sendOrderedBroadcast(   intent,  //意图
        null, // receiverPermission 接收的权限
        new MyReceiver(), //resultReceiver 最终的结果接收者
        null ,//scheduler 消息处理器, 使用主线程中的handler
        1, // initialCode 初始代码
        "主席讲话:每人奖励10斤土豆", // initialData
        null); // initialExtras  bundle类型 实际上就是对零散的数据做一次包装而已。
//修改数据
setResultData("主席讲话:每人奖励7斤土豆");
//终止广播的传输
abortBroadcast();
           

开始获取位置

// 获取位置管理器

    mLm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    // 生成位置提供者的条件
    Criteria criteria = new Criteria();
    criteria.setCostAllowed(true);// 允许花费
    criteria.setPowerRequirement(Criteria.POWER_HIGH);// 电量级别
    // 参2 设置true返回当前能用的提供者
    String provider = mLm.getBestProvider(criteria, true);
    long minTime = 0;// 获取位置的最小时间
    float minDistance = 0;// 获取位置的最小距离
    mLm.requestLocationUpdates(provider, minTime, minDistance, listener);
// 关闭位置获取
    // 停止位置服务 不用的时候就停了 耗电
    mLm.removeUpdates(listener);
           

给listview设置数据为空的图片

listview.setEmptyView(View v)
listview.setOnScrollListener();
           

编辑页面EditText的背景是一个selector 设置了是否可用状态

每种状态对应的图片是用xml文件写的shape   通过etNum.setEnabled(true);来转换不同状态显示的背景
    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle" >

        <!-- 四个角的弧度 -->
        <corners android:radius="5dp" />
        <!-- 颜色 -->
        <solid android:color="#FFFFCE" />

        <!--
            虚线间隔 android:dashGap="10dp"
            android:dashWidth="5dp"
        -->
        <stroke
            android:width="1dp"
            android:color="#9DCAD9" />

        <!-- 渐变色<gradient
            android:centerColor="#0f0"
            android:endColor="#00f"
            android:startColor="#f00"
            android:type="sweep"
            >
        </gradient> -->

    </shape>

    背景的selector

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/black_et_bg_enable" android:state_enabled="true" android:state_focused="true"/>
    <item android:drawable="@drawable/black_et_bg_unenable"/>
    </selector>


// 监听文字改变
    etNum.addTextChangedListener(new TextWatcher() {
        // 显示在输入框上
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        // 将要显示在输入框上
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        // 显示在输入框后
        @Override
        public void afterTextChanged(Editable s) {
            String num = s.toString();
            // 每次输入框文字改变后 实时查询更新
            String address = AddressADO.getAddress(getApplicationContext(), num);
            tvLoc.setText(address);
        }
    });
           

输入框为空的颤抖动画提醒

Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake);
    etNum.startAnimation(shake);        

    shake 是一个xml写的动画    
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="1000"
        android:fromXDelta="0"
        android:interpolator="@anim/cycle_7"
        android:toXDelta="10" />

    cycle_7 是一个插值器
    <cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
    android:cycles="7" />
           

判断服务是否运行

public static boolean isRunning(Context context,
        Class<? extends Service> serviceClz) {
    // 活动管理器
    ActivityManager am = (ActivityManager) context
            .getSystemService(Context.ACTIVITY_SERVICE);
    // 获取正在运行的服务信息
    List<RunningServiceInfo> runningServices = am.getRunningServices(1000);
    for (RunningServiceInfo runningServiceInfo : runningServices) {
        // 获取service对应的ComponentName对象
        ComponentName service = runningServiceInfo.service;
        String className = service.getClassName();
        // 判断传进来的服务是否在运行的服务信息里
        if (TextUtils.equals(className, serviceClz.getName())) {
            return true;
        }
    }
    return false;
}
           

通过查看toast源码知道 可以显示在任意页面上面的view 是添加到window上的

自定义一个toast 通过 WindowManager的addview方法给窗体添加一个view
// WindowManager 窗口管理器 可以给窗口添加view
    mWM = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);

    // 指定添加进窗口的view的布局参数
    params = new WindowManager.LayoutParams();
    params.height = WindowManager.LayoutParams.WRAP_CONTENT;
    params.width = WindowManager.LayoutParams.WRAP_CONTENT;
    params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
            | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
    // | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
    params.format = PixelFormat.TRANSLUCENT;

    调整显示级别 添加权限 SYSTEM_ALERT_WINDOW
    params.type = WindowManager.LayoutParams.TYPE_PRIORITY_PHONE;


    mWM.addView(viewAddress, params);
           
  • 自定义toast的触摸移动
    首先设置view的触摸监听
    viewAddress.setOnTouchListener(this);
               
在监听方法里 监听按下 移动 和抬起事件 计算手指移动距离 去移动view
// view 的触摸事件 自己处理的话 返回true
    @Override 
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:// 手指按下
            startX = (int) event.getRawX();
            startY = (int) event.getRawY();
            // System.out.println("起点坐标x" + startX + "y" + startX);
            break;
        case MotionEvent.ACTION_MOVE:// 手指移动
            int moveX = (int) event.getRawX();
            int moveY = (int) event.getRawY();
            // System.out.println("移动后坐标x" + moveX + "y" + moveY);
            int distanceX = moveX - startX;
            int distanceY = moveY - startY;
            params.x = params.x + distanceX;// 更改view的布局参数的位置为移动后的位置
            params.y = params.y + distanceY;
            mWM.updateViewLayout(viewAddress, params);// 更新view的位置
            startX = moveX;// 每次移动后 指向最新的起始点
            startY = moveY;
            break;
        case MotionEvent.ACTION_UP:// 手指抬起

            break;
        default:
            break;
        }

        return true;
    }
           
小伙箭发射后 打开背景activity 注意从service开启activity的问题
Intent intent = new Intent(mContext, RocketBgActivity.class);
    //从service开启一个actvity 添加一个标志  创建一个新的栈
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    mContext.startActivity(intent);
           

创建一个activity 设置主题为透明

android:theme="@android:style/Theme.Translucent.NoTitleBar"