windrider

windrider 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 个人简介什么都没有

个人动态

windrider 回答了问题 · 2016-11-15

解决发送Intent安装应用时,如果获取应用安装的结果

监听系统的应用安装或者更新广播
<action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package" />
最后一行是一定要加的, 然后从获得的Intent中提取出package信息,intent.getDataString(),看看是什么应用

关注 4 回答 3

windrider 关注了问题 · 2016-11-15

解决发送Intent安装应用时,如果获取应用安装的结果

需求:在应用中,能够获取推荐的应用列表,下载应用进行安装,且安装成功后会修改我当前的UI界面。

对于没有Root的机型,我的安装应用的方法就是下载APK到本地后,发送Intent请求,源码如下:

public static boolean installNormal(Context context, String filePath) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    File file = new File(filePath);
    if (!file.exists() || !file.isFile() || file.length() < 0) {
        return false;
    }

    LogUtil.e(TAG, "path=" + filePath);
    intent.setDataAndType(Uri.parse("file://" + filePath),
            "application/vnd.android.package-archive");
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(intent);
    return true;
}

使用这种方式,我无法判断出用户最终是否选择安装了应用(因为用户可能取消安装),因此无法进行相关UI的修改。

所以,想问一下大家,使用intent的方法安装应用如何获取应用安装的结果?

我个人想了两种方式:

  1. 注册广播,但是使用广播是否应该动态注册?监听哪些intent?

  2. 写一个线程无限轮询,但是不清楚线程默认的结束时间等相关限制条件?

关注 4 回答 3

windrider 关注了问题 · 2016-10-14

Android Activity theme是作用于哪个View?

一个Activity声明如下:

<activity android:name=".MainActivity"
    android:theme="@android:style/Theme.Wallpaper.NoTitleBar">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

可以看到Activity的背景变成了桌面壁纸,其原理是将壁纸设置为了Activity中某个View的背景吗,如果是,怎么找到这个View,并获取这个壁纸实例(也就是这个壁纸)呢?

关注 5 回答 4

windrider 回答了问题 · 2016-10-14

Android Activity theme是作用于哪个View?

getWindow().getDecorView();这个

关注 5 回答 4

windrider 关注了问题 · 2016-10-12

解决android系统中包名为android是什么应用?

在系统开发时,通过log查看到由包名为android的应用发起了一个alarm,这里有个疑问,这个android是代表什么呢?
AlarmManager: wakeup alarm = Alarm{14123fb2 type 0 when 1471594689034 android}; package = android needGrouping = true

关注 2 回答 2

windrider 回答了问题 · 2016-10-12

解决android系统中包名为android是什么应用?

android原生系统的应用或者服务

关注 2 回答 2

windrider 关注了问题 · 2016-10-11

怎么正确的隐藏navigationbar,并适配不同手机?

1.先说一下我的需求是,在进入app的splash界面播放一个gif动画来完成欢迎动画的实现。具体实现步骤是将主题设置windowBackground指定一张图片(这张图片即是gif图的第一帧),然后在进入splashactivity后,调用setContentView后,播放gif动画,但是这样实现有一个前提就是,gif图的位置必须和windowBackground设置的图的位置完全重合才行,这样看起来是一个完整的动画。

那么问题来了,经测试,在htc、华为等部分手机出现图片不重合的情况,研究发现是navigationbar的原因导致spalsh界面的布局受到影响。最后通过设置如下代码解决了在nexus5上不重合问题,代码如下:

View decorView = getWindow().getDecorView();
        int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_IMMERSIVE;
  decorView.setSystemUiVisibility(uiOptions);

上面这段代码的意思是,不让navigationbar影响原来的布局。但是这样会导致在htc、华为等部分手机上出现不重合问题(估计这些手机系统已经排除navigationbar的高度,也就是说不让navigationbar的高度参与布局)。而如果不设置以上代码,又会在nexus5上出现不重合问题。那么我该怎么判断系统是否已经排除了navigationbar高度呢?有人遇到过这个问题吗?

关注 4 回答 2

windrider 回答了问题 · 2016-10-11

怎么正确的隐藏navigationbar,并适配不同手机?

用了android:fitsSystemWindows="true"了么

关注 4 回答 2

windrider 关注了问题 · 2016-10-11

Android 控件不显示?

问题描述

我自定义了一个继承自RelativeLayout的布局,效果是向右滑动后,内部的控件会向右移出屏幕。左划后又移回屏幕。
现在的情况是,内部控件右划移出屏幕后,把应用切换回后台,再切换到前台,然后左划把内部控件移回屏幕,这时这些内部控件会不显示,但是它们的确存在在那里,并可以接收点击效果,点击后就会显示出来。

需要的效果

现在想要的效果是从回台回来后,把内部控件拖动回屏幕后,直接显示。应该需要怎么实现?我试过用invalidate()刷新,可是不起作用。

自定义的可拖动布局

package com.leu.textapplication;

import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.RelativeLayout;
import android.widget.Scroller;

/**
 * Created by Leu on 2016/10/8.
 */

public class ScrollRelativeLayout extends RelativeLayout implements View.OnTouchListener {

    private Scroller mScroller;
    private int mScreenWitdh;
    //0表示隐藏,1表示显示
    private int beginX;
    private int distanceX;
    private GestureDetector mGestureDetector;

    public ScrollRelativeLayout(Context context) {
        super(context);
        initView(context);
    }

    public ScrollRelativeLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView(context);
    }

    public ScrollRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView(context);
    }

    private void initView(Context context) {
        //setFocusable(true);
        //requestFocus();
        //this.setLongClickable(true);
        this.setOnTouchListener(this);
        //setFocusable(true);
        setDescendantFocusability(FOCUS_BEFORE_DESCENDANTS);

        mScroller = new Scroller(context);
        WindowManager wm = (WindowManager) context
                .getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics outMetrics = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(outMetrics);
        mScreenWitdh = outMetrics.widthPixels;

        mGestureDetector = new GestureDetector(context, new SimpleGestureListener());
        mGestureDetector.setIsLongpressEnabled(true);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return mGestureDetector.onTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                beginX = (int) event.getX();
                break;
            case MotionEvent.ACTION_MOVE:
                break;
            case MotionEvent.ACTION_UP:
                Log.d("ScrollRelativeLayout", "执行up");
                Log.d("ScrollRelativeLayout", "distanceX:" + distanceX);
                distanceX = (int) event.getX() - beginX;
                //右划
                if (distanceX > 0) {
                    //右划超过固定距离
                    if (distanceX > 200) {
                        scrollRight();
                        //右划未超过固定距离
                    } else {
                        scrollLeft();
                    }
                    //左划
                } else if(distanceX<0){
                    //左划超过固定距离
                    if (distanceX < -200) {
                        scrollLeft();
                        //左划未超过固定距离
                    } else {
                        scrollRight();

                    }
                }

//通知View进行重绘,从而调用computeScroll的模拟过程
                invalidate();
                break;
        }
        return true;
    }


    private class SimpleGestureListener extends
            GestureDetector.SimpleOnGestureListener {
        public boolean onScroll(MotionEvent e1, MotionEvent e2,
                                float distanceX, float distanceY) {

            //在主屏幕时,才能进行拖动。
            if (getScrollX() + distanceX <= 0 && getScrollX() + distanceX > -mScreenWitdh) {
                scrollBy((int) distanceX, 0);
            }

            return false;
        }

        //当执行onFling后,onTouchEvent的up动作不会再执行。
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                               float velocityY) {
            Log.d("ScrollRelativeLayout", "执行fling");
            if (e1.getX() - e2.getX() > 0 && getScrollX() <= 0 && getScrollX() > -mScreenWitdh) {
                //左划
                scrollLeft();
            } else if (e2.getX() - e1.getX() > 0 && getScrollX() <= 0 && getScrollX() > -mScreenWitdh) {
                //右划
                scrollRight();
            }
            invalidate();
            return true;
        }


    }

    /**
     * 左划进屏幕
     */
    private void scrollLeft() {
        mScroller.startScroll(
                getScrollX(),
                0,
                -getScrollX(),
                0);
    }

    /**
     * 右划出屏幕
     */
    private void scrollRight() {
        mScroller.startScroll(
                getScrollX(),
                0,
                -(mScreenWitdh + getScrollX()),
                0);
    }


    /**
     * 重写computeScroll方法,实现模拟滑动
     * 系统在绘制View的时候会在draw方法中调用该方法
     */
    @Override
    public void computeScroll() {
        super.computeScroll();
        // 判断Scroller是否执行完毕,是否完成了整个滑动
        //当模拟过程结束后,该方法会返回false,从而中断循环,完成整个平滑移动过程。
        if (mScroller.computeScrollOffset()) {
            //通过不断地瞬间移动一个小的距离来实现整体上的平滑移动效果
            scrollTo(
                    mScroller.getCurrX(),//获得当前的滑动坐标
                    mScroller.getCurrY());
            // 通过重绘来不断调用computeScroll,通过invalidate→draw→computeScroll来间接调用。
            invalidate();
        }
    }
}

关注 2 回答 2

windrider 回答了问题 · 2016-10-11

Android 控件不显示?

这是因为Scroller只是移动了控件的内容(相当于视图)而已,控件的本身并没真的移动。这就好比视图动画,你可以试试使用属性动画,通过改变translationX translationY这些属性来移动。

关注 2 回答 2

认证与成就

  • 获得 12 次点赞
  • 获得 6 枚徽章 获得 1 枚金徽章, 获得 2 枚银徽章, 获得 3 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2016-03-15
个人主页被 775 人浏览