1.在做程序自动安装更新的时候 ,必须保证程序的签名和包名是相同. C:\Documents and Settings\zehua\.android \ debug.keystore debug的签名,开发时候的签名 Re-installation failed due to different application signatures. Please execute 'adb uninstall cn.itcast.mobilesafe' in a shell.
2.两种上下文区别:
applicationcontext 生命周期 进程存在 上下文就存在
activity.this activity 在任务栈 上下文存在
例如:在打开数据库传入上下文时间,要用应用程序上下文,因为如果你用activity上下文,如果回收了 就不存在,就出错了,所以弹出框只能和acitvity上下文,如果是全局的要用全局上下文。
3.android:gravity与android:layout_gravity
LinearLayout有两个非常相似的属性:android:gravity与android:layout_gravity。 他们的区别在于:android:gravity用于设置View组件的对齐方式, 而android:layout_gravity用于设置Container组件的对齐方式。
举个例子,我们可以通过设置android:gravity="center" 来让EditText中的文字在EditText组件中居中显示; 同时我们设置EditText的android:layout_gravity="right" 来让EditText组件在LinearLayout中居中显示。
4、需要指定 FLAG_ACTIVITY_NEW_TASK 属性:
如果你在广播接收者和服务里面去开启一个activity的时间 ,因为广播接收者和服务没有任务栈,所以要显式的指定。
5、终止广播方法:
不能通过abortBroad因为通话调用发送广播的方法是带有接收者API,这个方法 不能被abortBroad结束,要用setResult(null) 结束。
6、自定义窗口:
开始自定义弹出窗,其实就是继承,然后重写这个样式 。
//这将是最简单的一种方法,至此把XML转换成View对象已有三种方法
View view = View.inflate(this, R.layout.first_entry_dialog, null);
实现: LayoutInflater factory = LayoutInflater.from(context);
return factory.inflate(resource, root);
7、状态图形和形状图形的使用:
<!-- 第一:处理按钮在不同状态下颜色不同
第二:处理GridView在点击和不点击下颜色不同。
第三:优化显示padding与margin的区别。
button_selector.xml这个就是State List的配置。 -->
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/button_background" android:state_enabled="true" android:state_window_focused="false"/>
<item android:drawable="@drawable/button_background_selected" android:state_pressed="true"/>
<item android:drawable="@drawable/button_background" android:state_focused="true"/>
<item android:drawable="@drawable/button_background"/>
</selector>
<!--其实就是对一个按钮在不同状态下给设置不同的图片。 那么这些背景图片的配置是这样的。 -->
button_background.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<corners android:radius="2dip" >
</corners>
<gradient android:startColor="#ff2c2d2d"
android:centerColor="#ff262626"
android:endColor="#ff515151"
/>
</shape>
<!--
按钮其它背景都是这样,只是颜色不一样。
然后在用按钮的时间这样调用:
android:background="@drawable/button_selector"
调用的是一个列表,也就是把这个列表作为一个背景列表传到它 ,
然后不同的状态下,显示不同的背景图片。很简单。
也就是说,以前我们可能只用一张图片作为背景 ,但是现在我们用
很多张图片形成一个列表作为它的背景,然后在不同的状态下调用不同的。
例如我们以前可以直接把button_background作为背景了,
android:background="@drawable/button_background"
但是现在我们用列表。 如何 让GridView,ListView这些东西也变色呢?
item_background_selector.xml -->
<?xml version="1.0" encoding="utf-8"?>
<!-- 用于配置GridView背景图片列表 -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/item_background" android:state_enabled="true" android:state_window_focused="false"/>
<item android:drawable="@drawable/item_background_selected" android:state_pressed="true"/>
<item android:drawable="@drawable/item_background" android:state_focused="true"/>
<item android:drawable="@drawable/item_background"/>
</selector>
里面引用的是:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- 这是画一个正文形,下面是对这个正文形的一些作用。 -->
<!-- 描边 -->
<stroke
android:width="0.5dip"
android:color="#ff505050"/>
<!-- 圆角 -->
<corners android:radius="2dip" ></corners>
<gradient
android:startColor="#ff404040"
android:centerColor="#ff383838"
android:endColor="#ff404040"
/>
</shape> 关键是调用,首先在GridView条目的XML文件里面写上:
android:background="@drawable/item_background_selector"
我就是因为这点没有写,才出现问题的,不能正常显示的。 最后:
<GridView android:listSelector="@drawable/item_background_selector" />
8、alignParentBottom:
有一个小Bug,在相对布局里面,如果在控件里面 用了alignParentBottom这些设置为true了,那么相对布局里面的gravity会失效。
9、activity切换之间:
activity切换之间overridePendingTransition
10、一条线的处理方式:
<!--可以用ImageView也可以用View. 用一张这样的图片:最关键的就是那张背景图片。 -->
<ImageView
android:layout_height="1dip"
android:layout_width="fill_parent"
android:layout_marginTop="8dip"
android:background="@drawable/devide_line"
/>
11、GPS小工具:
/**
* 保证这个类只存在一个实例 :单态
* @author chen
*
*/
public class GPSInfoProvider {
private static GPSInfoProvider mGpsInfoProvider;
private static Context context;
private MyLoactionListener listener;//都是保存只在一个这样的实例
LocationManager manager; //1.私有化构造方法
private GPSInfoProvider(){}; public static synchronized GPSInfoProvider getInstance(Context context){
if (mGpsInfoProvider == null) {
mGpsInfoProvider = new GPSInfoProvider();
GPSInfoProvider.context = context;
}
return mGpsInfoProvider;
}
/**
* 获取gps 信息
* @return
*/
public String getLocation(){
manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
//manager.getAllProviders(); // gps //wifi // 它 能够 得到所有的这种东西,但是不能确定哪个是最好的。
String provider = getProvider(manager);
// 注册位置的监听器 60000:变化多长时间更新一次,10:变化多少米更新一次 listener:发生变化的时间调用的回调方法
manager.requestLocationUpdates(provider, 60000, 10, getListener());
//获取上次存储进去的信息,如果没有返回空
SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
String location = sp.getString("location", "");
return location;
}
/**
* 保证只有一个实例
* @return
*/
private MyLoactionListener getListener(){
if (listener == null) {
listener = new MyLoactionListener();
}
return listener; } // 停止gps监听
public void stopGPSListener(){
manager.removeUpdates(getListener());
} private class MyLoactionListener implements LocationListener{
/**
* 当手机位置发生改变的时候 调用的方法
*/
@Override
public void onLocationChanged(Location location) {
String latitude ="latitude "+ location.getLatitude(); //weidu
String longtitude = "longtitude "+ location.getLongitude(); //jingdu
SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
Editor editor = sp.edit();
editor.putString("location", latitude+" - "+ longtitude);
editor.commit(); //最后一次获取到的位置信息 存放到sharedpreference里面
}
/**
* 某一个设备的状态发生改变的时候 调用 可用->不可用 不可用->可用
*/
@Override
public void onProviderDisabled(String provider) {
}
/**
* 某个设备被打开
*/
@Override
public void onProviderEnabled(String provider) {
}
/**某个设备被禁用
*
*/
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
} } /**
* @param manager 位置管理服务
* @return 最好的位置提供者
*/
private String getProvider(LocationManager manager){
Criteria criteria = new Criteria();//设置GPS的标准;尺度;准则
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setPowerRequirement(Criteria.POWER_MEDIUM);
criteria.setSpeedRequired(true);
criteria.setCostAllowed(true);
//true表示保返回已经打开的设备
return manager.getBestProvider(criteria, true);
} }
12、如何把一个应用程序设置为设备管理器:
如果一个程序设置成设备管理器,那么该程序就不会轻易被卸载。如果要卸载可以通过刷机或者在“位置与安全”->"选择设备管理器"可以讲该程序从设备管理器中移除。
/*把一个应用程序设置为设备管理器,那么这个软件就不能被xie zai
如果你在设置里面的做了取消激活又可以xie zai.
然后你可以在设置里面把这个选项给隐藏。 更为牛逼的功能,
file:///D:/android-sdk-windows/docs/guide/topics/admin/device-admin.html
只要有这个你可以使软件不能卸载,并且可以锁屏,清除手机数据等。
1.创建 MyAdmin 的广播接受者 继承 DeviceAdminReceiver,并注册它
2、写相应的XML文件
3.注册广播接受者为admin设备
*/
ComponentName mAdminName = new ComponentName(this, MyAdmin.class);
if (mService != null) {
if (!mService.isAdminActive(mAdminName)) {
Intent intent = new Intent(
DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mAdminName);
startActivity(intent);
}
}
2.2以上的android系统支持 1.创建 MyAdmin 的广播接受者 继承 DeviceAdminReceiver <receiver android:name=".MyAdmin">
<meta-data android:name="android.app.device_admin"
android:resource="@xml/my_admin" />
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
</receiver> my_admin.xml <?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
<limit-password />
<watch-login />
<reset-password />
<force-lock />
<wipe-data />
</uses-policies>
</device-admin> 2.获取IDevicePolicyManager Method method = Class.forName("android.os.ServiceManager")
.getMethod("getService", String.class);
IBinder binder = (IBinder) method.invoke(null,
new Object[] { Context.DEVICE_POLICY_SERVICE });
mService = IDevicePolicyManager.Stub.asInterface(binder); 3.注册广播接受者为admin设备
ComponentName mAdminName = new ComponentName(this, MyAdmin.class);
if (mService != null) {
if (!mService.isAdminActive(mAdminName)) {
Intent intent = new Intent(
DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra (DevicePolicyManager.EXTRA_DEVICE_ADMIN,
mAdminName);
startActivity(intent);
}
}
13、程序开发中资源文件如何放置:
1. res目录建立一个文件夹 raw 在R文件中生成一个id的引用 最好推荐存放一些小的资源 几十k 几百K
2. assets 资产目录 不会把里面的内容在R 文件中生成一个引用 assets 不推荐我们存在1M 文件 appt 打包工具可能出现问题.
3. javame
把大的资源文件放置在src目录下 通过类加载器的方式 获取这个资源文件
导致我们应用程序的体积非常大.
4. 程序的主apk很小 素材文件 资源文件从服务器上下载
sdcard rom
一般游戏软件 大的oa软件
地图软件 离线地体20~100M~ 1G
14、子线程不能对UI进行更改,为什么Progress可以不断的更新进度呢?
/* 因为底层它已经实现是通过Handler更新的,你可以看源码,而且可以在子线程里面 写dismiss,其实底层就是显示: */
public void dismiss() {
if (Thread.currentThread() != mUiThread) {
mHandler.post(mDismissAction);
} else {
mDismissAction.run();
}
}
//如果不是主线和就告诉Handler去结束它,如果是主线程直接结束。
15、ImageView一些东西:
ImageView一些东西?src background ScaleType 区别?
其实ImageView与HTML下的DIV一样,其实所有的控件都可以看成HTML下的 DIV,你设置个SRC只是把它内部显示的那一部分填充了,所以有了padding 这个属性,如果你填写background把整个都填充了。
而ScaleType ScaleType的值分别代表的意义: ImageView是Android中的基础图片显示控件,该控件有个重要的属性是ScaleType,该属性用以表示显示图片的方式,共有8种取值 ScaleType.CENTER::图片大小为原始大小,如果图片大小大于ImageView控件,则截取图片中间部分,若小于,则直接将图片居中显示。 ScaleType.CENTER_CROP:将图片等比例缩放,让图像的短边与ImageView的边长度相同,即不能留有空白,缩放后截取中间部分进行显示。 ScaleType.CENTER_INSIDE:将图片大小大于ImageView的图片进行等比例缩小,直到整幅图能够居中显示在ImageView中,小于ImageView的图片不变,直接居中显示。 ScaleType.FIT_CENTER:ImageView的默认状态,大图等比例缩小,使整幅图能够居中显示在ImageView中,小图等比例放大,同样要整体居中显示在ImageView中。 ScaleType.FIT_END:缩放方式同FIT_CENTER,只是将图片显示在右方或下方,而不是居中。 ScaleType.FIT_START:缩放方式同FIT_CENTER,只是将图片显示在左方或上方,而不是居中。 ScaleType.FIT_XY:将图片非等比例缩放到大小与ImageView相同。即填充整个ImageView. ScaleType.MATRIX:是根据一个3x3的矩阵对其中图片进行缩放 任何一个View都有一个叫做layout的方法。非常好用。
tv_drag_view.layout(tv_drag_view.getLeft(), 260, tv_drag_view.getRight(), 280);
l Left position, relative to parent
t Top position, relative to parent
r Right position, relative to parent
b Bottom position, relative to parent //为布局中的某个控件显式指定其位置。
android.widget.RelativeLayout.LayoutParams layoutParams = (android.widget.RelativeLayout.LayoutParams) iv_drag_view.getLayoutParams();
layoutParams.leftMargin = x;
layoutParams.topMargin = y;
iv_drag_view.setLayoutParams(layoutParams);