一些杂乱的知识点(三)

Android一些杂乱的知识点(三)

1.定义style(样式) 抽取View的xml属性

有时候一个布局中每个Child的样式都一样,这样每次都重写很多一模一样的属性,太冗余.于是,将这些属性抽取出来,然后定义到style中,就像下面这样

<!-- 这是侧滑菜单的样式    抽取出来
 -->
<style name="style_bt_text" parent="android:Widget.Holo.Light.TextView">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:background"></item>
    <item name="android:background">@drawable/selector_menu_bt_bg</item>
    <item name="android:drawablePadding">10dp</item>
</style>

然后在使用该style的时候,可以这样写:

 <TextView
        style="@style/style_bt_text"
        android:drawableLeft="@drawable/tab_news"
        android:text="新闻"/>

2.图片选择器

在选中和未选中的过程中,切换展示图片(比如Button的按下与未按下)

在api中这样查找相应位置,示例:Develop—>API Guides—>AppResource—>Resource Types—–>Drawable—->StateList

selector放置的路径res/drawable/button.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_pressed="true"
          android:drawable="@drawable/button_pressed" /> <!-- 选中按钮图片 -->
        <item android:state_focused="true"
          android:drawable="@drawable/button_focused" /> <!-- 按钮获取焦点图片 -->
        <item android:state_hovered="true"
          android:drawable="@drawable/button_focused" /> <!-- 平板电视,悬浮选中某个应用图片 -->
        <item android:drawable="@drawable/button_normal" /> <!-- 默认图片-->
    </selector>

<Button
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:background="@drawable/button" />

3.创建手势管理的对象,用作管理在onTouchEvent(event)传递过来的手势动作

通过该对象可以轻松管理onTouchEvent中的事件

public class Setup1Activity extends BaseActivity {

    private GestureDetector mGesture;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_setup1);

        /*
            创建手势管理的对象,用作管理在onTouchEvent(event)传递过来的手势动作
         */
        mGesture = new GestureDetector(this, new GestureDetector
                .SimpleOnGestureListener() {
            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float
                    velocityY) {
                //监听手势的移动
                if (e1.getX() - e2.getX() > 0) {
                    //用户想要跳转到下一页
                    //跳转到设置界面2
                    Intent intent = new Intent(Setup1Activity.this, Setup2Activity.class);
                    startActivity(intent);

                    finish();
                }

                return true;
            }
        });

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        mGesture.onTouchEvent(event);
        return super.onTouchEvent(event);
    }
}

4.播放短暂的音乐

1.需要将资源文件放在res/raw下面,然后

MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.ylzs);
mediaPlayer.setLooping(true);   //设置循环播放
mediaPlayer.start();   //开始播放

5.Android Screen Monitor同步手机屏幕到PC

1.工具:Android Screen Monitor
2.下载地址:https://adakoda.github.io/android-screen-monitor/
或者http://download.csdn.net/detail/guidechange4585/6810711
3.使用方法:配置好Java环境变量,由于我们使用的是jar,所以配置好环境变量后比较方便,如果SDK环境变量配置好了,直接按照官网上的方法就可以了,如果没有配置,那么:java -jar /data/SDK/sdk/platform-tools/asm.jar
然后选择你的手机就行.

6.获取手机位置(GPS方式)

//1, 获取LocationManager对象
    LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    //2, 请求获取位置
    //参数:  minTime:更新时间间隔   minDistance:更新距离间隔    
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,1, 0,new LocationListener(){

        @Override
        public void onLocationChanged(Location location) {
            //位置发生变化
            Toast.makeText(getApplicationContext(), "位置发生变化", Toast.LENGTH_SHORT).show();
            double longitude = location.getLongitude();  //经度
            double latitude = location.getLatitude();    //纬度
            Log.d("xfhy", "longitude = "+longitude+", latitude = "+latitude);
            tv_location.setText("longitude = "+longitude+", latitude = "+latitude);
        } 

        @Override
        public void onStatusChanged(String provider, int status,
                Bundle extras) {
            //位置提供者的状态发生变化
            Toast.makeText(getApplicationContext(), "位置提供者的状态发生变化", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onProviderEnabled(String provider) {
            //位置提供者可用
            Toast.makeText(getApplicationContext(), "位置提供者可用", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onProviderDisabled(String provider) {
            //位置提供者不可用
            Toast.makeText(getApplicationContext(), "位置提供者不可用", Toast.LENGTH_SHORT).show();
        }

    });

其次,需要权限:

<!-- 获取准确GPS坐标的权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 允许模拟器模拟位置坐标的权限 -->
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<!-- 获取粗略坐标的权限(网络定位时使用) -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

7.设备管理器使用

1.查看google文档Administration—->device polices—->清单文件的配置mainfest.xml

<receiver android:name=".app.DeviceAdminSample$DeviceAdminSampleReceiver"
        android:label="@string/sample_device_admin"
        android:description="@string/sample_device_admin_description"
        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>

2.将mainfest.xml广播接受者子类创建出来DeviceAdmin继承至DeviceAdminReceiver

3.将清单文件中的错误进行修复(字符串创建,xml文件创建)

4.在res/xml文件夹下创建文件device_admin_sample.xml

    <device-admin xmlns:android="http://schemas.android.com/apk/res/android">
      <uses-policies>
        <limit-password />
        <watch-login />
        <reset-password />
        <force-lock />
        <wipe-data />
        <expire-password />
        <encrypted-storage />
        <disable-camera />
      </uses-policies>
    </device-admin>

5.开启激活界面的activity

ComponentName mDeviceAdminSample = new ComponentName(context, DeviceAdmin.class);

    Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
    intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample);
    intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
        mActivity.getString(R.string.add_admin_extra_app_text));
    startActivity(intent);

6.一键激活

一键锁屏必须在激活前提下才可以使用

//判断激活的状态
    boolean adminActive = mDPM.isAdminActive(mDeviceAdminSample);
    if(adminActive){
        mDPM.lockNow();
        //设置再次点亮屏幕时需要输入密码
        //mDPM.resetPassword("1234", 0);
    }else{
        Toast.makeText(this, "请先激活", 0).show();
    }

7.一键清除数据

前提:必须在激活的情况下才可以使用

//判断是否激活   如果未激活就去清除数据,则会报异常
if(mDPM.isAdminActive(mDeviceAdminSample)){
    mDPM.wipeData(0);   //清除手机的数据
    //mDPM.wipeData(DevicePolicyManager.WIPE_EXTERNAL_STORAGE);  //手机数据和外部存储设备的数据都会被清除
} else {
    Toast.makeText(getApplicationContext(), "请先激活", Toast.LENGTH_SHORT).show();
}

8.一键卸载

  • 在设备管理器中没有激活,则可以直接卸载
  • 在设备管理器中已做激活,不可以卸载,系统会提示取消在设备管理器中的激活,然后才可以卸载
  • 卸载是Android系统自带的功能,只需要调用系统的卸载界面(Activity)就行,看源码,PackageInstaller里面.找到清单文件中,uninstallActivity源码,
    匹配对应的action,category,data(应用的包名)去卸载指定应用.

8.Android源码解读

下载到一个Android 的源代码压缩文件,一般是很大的,好几个G.里面,有些东西是没用的,如果只是想看看系统的应用程序包(即原生应用的源代码),可以查看一下路径
android-7.0.0_r1.7z\android-7.0.0_r1\packages

9.获取项目安装目录下的一些路径

1.getAssets().open(addressDbName); //获取项目的assets中addressDbName的输入流

2.getCacheDir(); //返回文件系统上应用程序特定缓存目录的绝对路径。 这些文件将是设备在存储空间不足时首先被删除的文件。 这些文件将被删除不能保证。 注意:您不应该依靠系统为您删除这些文件; 您应该总是有一个合理的最大值,例如1 MB,用于使用缓存文件的空间量,并在超出该空间时修剪这些文件。

3.getFilesDir(); //返回文件系统中目录的绝对路径,其中存储使用openFileOutput(String,int)创建的文件。
无需读取或写入返回路径的权限,因为此路径是内部存储。

posted @ 2017-04-27 08:10  潇风寒月  阅读(8)  评论(0)    收藏  举报