一些杂乱的知识点(三)
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)创建的文件。
无需读取或写入返回路径的权限,因为此路径是内部存储。