android有用的知识

DownloadManager是Android为开发者提供的一个后台应用组件,它通过Http层进行文件的下载任务.
1:使用
首先要在AndroidManifest.xml中申请访问DownloadManager的权限

添加一个下载任务:
ContentValues values = new ContentValues();
values.put(Downloads.URI, url);//指定下载地址
values.put(Downloads.COOKIE_DATA, cookie);//如果下载Server需要cookie,设置cookie
values.put(Downloads.VISIBILITY,Downloads.VISIBILITY_HIDDEN);//设置下载提示是否在屏幕顶部显示
values.put(Downloads.NOTIFICATION_PACKAGE, getPackageName());//设置下载完成之后回调的包名
values.put(Downloads.NOTIFICATION_CLASS, DownloadCompleteReceiver.class.getName());//设置下载完成之后负责接收的Receiver,这个类要继承BroadcastReceiver
values.put(Downloads.DESTINATION,save_path);//设置下载到的路径,这个需要在Receiver里自行处理
values.put(Downloads.TITLE,title);//设置下载任务的名称
this.getContentResolver().insert(Downloads.CONTENT_URI, values);//将其插入到DownloadManager的数据库中,数据库会触发修改事件,启动下载任务

2:如何为DownloadManager设置代理,比如Wap
values.put(Downloads.PROXY_HOST,”10.0.0.172″);
values.put(Downloads.PROXY_PORT,”80″);

3:如何在下载过程中监听下载任务
可以通过监听数据库来实现
DownloadsChangeObserver mDownloadObserver=new DownloadsChangeObserver(Downloads.CONTENT_URI);
private class DownloadsChangeObserver extends ContentObserver {
public DownloadsChangeObserver(Uri uri) {
super(new Handler());
}
@Override
public void onChange(boolean selfChange) {
//查询需要监听的字段
//比如要监听实时下载进度,查看当前下载状态:是否已经断开,或者下载失败等等
StringBuilder wherequery = new StringBuilder(Downloads.TITLE);
wherequery.append(“=”);
wherequery.append(“‘”);
wherequery.append(mTitle);
wherequery.append(“‘”);

mDownloadCursor =mContext.getContentResolver().query(Downloads.CONTENT_URI, new String[] {Downloads.TITLE, Downloads.STATUS, Downloads.CURRENT_BYTES,}, wherequery.toString(), null,orderBy);
int mSizeColunmId=mDownloadCursor.getColumnIndexOrThrow(Downloads.CURRENT_BYTES);
mDownloadCursor.moveToFirst();
int size=mDownloadCursor.getInt(mSizeColunmId);


4:如何删除下载记录
private void deleteHistory(String title)//删除掉指定名称的下载记录
{
StringBuilder whereDelete = new StringBuilder(Downloads.TITLE);
whereDelete.append(“=”);
whereDelete.append(“‘”);
whereDelete.append(str);
whereDelete.append(“‘”);
this.getContentResolver().delete(Downloads.CONTENT_URI,whereDelete.toString(), null);
}




在Android中,申请WakeLock可以让你的进程持续执行即使手机进入睡眠模式,比较实用的是比如后台有网络功能,可以保证操作持续进行.
方法: 在操作之前加入
PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);

wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, Constants.TAG);
wakeLock.acquire();

别忘了在操作完毕之后释放掉
if (wakeLock != null) {

wakeLock.release();
wakeLock = null;
}

最近在做项目的时候,遇到这样的问题,我需要能够把整个application都杀死,找了半天都没有找到,后来问同事才知道答案。代码如下:
view plaincopy to clipboardprint?

ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
mActivityManager .restartPackage(context.getPackageName());

在此做个记录,以备忘记!

Android 获取系统中所有安装的APK的信

private
private void loadApps() {
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
mApps = getPackageManager().queryIntentActivities(mainIntent, 0);
}
public class AppsAdapter extends BaseAdapter {
public AppsAdapter() {
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageView i;
if (convertView == null) {
i = new ImageView(Grid1.this);
i.setScaleType(ImageView.ScaleType.FIT_CENTER);
i.setLayoutParams(new GridView.LayoutParams(50, 50));
} else {
i = (ImageView) convertView;
}
ResolveInfo info = mApps.get(position);
i.setImageDrawable(info.activityInfo.loadIcon(getPackageManager()));
return i;
}

public final int getCount() {
return mApps.size();
}
public final Object getItem(int position) {
return mApps.get(position);
}
public final long getItemId(int position) {
return position;
}
List mApps;

安装完Android SDK后,默认会在C盘创建一个.Android的文件夹用来存放AVD.此时如果想修改AVD的路径,可以设置一个环境变量ANDROID_SDK_HOME=要设置的路径(比如:F:\Java\Android),重新启动Eclipse,修改成功!

android在处理一写图片资源的时候,会进行一些类型的转换,现在有空整理一下:
1、Drawable → Bitmap
Java代码

public static Bitmap drawableToBitmap(Drawable drawable) {

Bitmap bitmap = Bitmap
.createBitmap(
drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight(),
drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
: Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
//canvas.setBitmap(bitmap);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
drawable.draw(canvas);
return bitmap;
}
2、从资源中获取Bitmap
Java代码

Resources res=getResources();

Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic);
3、Bitmap → byte[]
Java代码

private byte[] Bitmap2Bytes(Bitmap bm){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
return baos.toByteArray();
}

4、 byte[] → Bitmap

Java代码

private Bitmap Bytes2Bimap(byte[] b){
if(b.length!=0){
return BitmapFactory.decodeByteArray(b, 0, b.length);
}
else {
return null;
}
}


通过分析Launcher的生成快捷方式的过程,找出了使用Intent发送请求,Launcher通过自己注册的InstallShortCutReceiver和UnInstallShortCutReceiver实现了快捷方式图标的生成与移除过程。本文主要分析外部apk如何使用Intent请求生成快捷方式和移除快捷方式图标的问题。

生成快捷方式代码:

Java代码

private static final String ACTION_INSTALL_SHORTCUT =
“com.android.launcher.action.INSTALL_SHORTCUT”;

/**
* 是否可以有多个快捷方式的副本
*/
static final String EXTRA_SHORTCUT_DUPLICATE = “duplicate”;

Intent shortcutIntent = new Intent(ACTION_INSTALL_SHORTCUT);
shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME,
getString(R.string.app_name));
shortcutIntent.putExtra(EXTRA_SHORTCUT_DUPLICATE, false);
Intent intent2 = new Intent(Intent.ACTION_MAIN);
intent2.addCategory(Intent.CATEGORY_LAUNCHER);

intent2.setComponent(new ComponentName(this.getPackageName(),
“.Main”));

shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent2);
shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
Intent.ShortcutIconResource.fromContext(this,
R.drawable.icon));
sendBroadcast(shortcutIntent);

注:Intent intent2 = new Intent(Intent.ACTION_MAIN); 这个也可以换成的构造参数也可以是Intent.ACTION_CREATE_SHORTCUT,也可以生成快捷方式图标,但是这样不标准,在删除的时候如果不和这个对于相同则无法删除。所以还是用Intent.ACTION_MAIN。

那么删除快捷方式的代码是:
Java代码

private static final String ACTION_UNINSTALL_SHORTCUT =
“com.android.launcher.action.UNINSTALL_SHORTCUT”;

Intent intent = new Intent(ACTION_UNINSTALL_SHORTCUT );
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, appName);
ComponentName comp = new ComponentName(info.activityInfo.packageName,
info.activityInfo.name);
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent()
.setComponent(comp).setAction(“android.intent.action.MAIN”));
sendBroadcast(intent);

常用的Android自定义主题

android:theme="@android:style/Theme.Dialog"   将一个Activity显示为能话框模式

android:theme="@android:style/Theme.NoTitleBar"  不显示应用程序标题栏

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"  不显示应用程序标题栏,并全屏

android:theme="Theme.Light"  背景为白色

android:theme="Theme.Light.NoTitleBar"  白色背景并无标题栏

android:theme="Theme.Light.NoTitleBar.Fullscreen"  白色背景,无标题栏,全屏

android:theme="Theme.Black"  背景黑色

android:theme="Theme.Black.NoTitleBar"  黑色背景并无标题栏

android:theme="Theme.Black.NoTitleBar.Fullscreen"   黑色背景,无标题栏,全屏

android:theme="Theme.Wallpaper"  用系统桌面为应用程序背景
android:theme="Theme.Wallpaper.NoTitleBar"  用系统桌面为应用程序背景,且无标题栏
android:theme="Theme.Wallpaper.NoTitleBar.Fullscreen"  用系统桌面为应用程序背景,无标题栏,全屏
android:theme="Translucent"
android:theme="Theme.Translucent.NoTitleBar"
android:theme="Theme.Translucent.NoTitleBar.Fullscreen"
android:theme="Theme.Panel"
android:theme="Theme.Light.Panel"


使用Intent调用系统的Camera程序的裁剪功能实现图片修剪。
 Intent intent = new Intent("com.android.camera.action.CROP");  
  intent.setClassName("com.android.camera", "com.android.camera.CropImage");  
 不过可能会出现无法找到Activity的android.content.ActivityNotFoundException异常,这是由于Android内部的gallery和camera都有处理,可以尝试另一种URI,com.android.gallery的com.android.camera.CropImage,在setClassName时,具体的代码为
final Intent intent = new Intent("com.android.camera.action.CROP");
intent.setClassName("com.android.camera", "com.android.camera.CropImage");
intent.setData(Uri.fromFile(mFile));
intent.putExtra("outputX", width);
intent.putExtra("outputY", height);
intent.putExtra("aspectX", width);
intent.putExtra("aspectY", height);
intent.putExtra("scale", true);
intent.putExtra("noFaceDetection", true);
intent.putExtra("output", Uri.parse("file:/" + mFile.getAbsolutePath()));
startActivityForResult(intent, REQUEST_CROP_IMAGE);


1.思路是通过自己构建KeyEvent对象来改变键的功能。


 例如,把所有的按键都改成“返回键”的功能,代码如下:




 //这里构建KeyEvent对象,其功能为返回键的功能
 //因此我们按任意键都会执行返回键功能
 KeyEvent key = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);

 //这里传入的参数就是我们自己构建的KeyEvent对象key
 super.onKeyDown(key.getKeyCode(), key);

至此OK
 控件事件是通过(setOnClickListener)设置其控件的监听器来监听并重写某些函数来处理。




 按键按下事件:通过重写onKeyDown方法


 按键重复点击:通过重写onKeyMultiple方法
 按键弹起事件:通过重写onKeyUp方法
 触笔点击事件:通过实现onTouchEvent方法

-------------------------------------------------------------------------------------------------------------------------

获取android IP

参考前人研究成果,非个人创作
1.使用WIFI
首先设置用户权限
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
其次,代码如下
public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);

       //获取wifi服务
       WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
       //判断wifi是否开启
       if (!wifiManager.isWifiEnabled()) {
       wifiManager.setWifiEnabled(true);  
       }
       WifiInfo wifiInfo = wifiManager.getConnectionInfo();      
       int ipAddress = wifiInfo.getIpAddress();  
       String ip = intToIp(ipAddress);  
       EditText et = (EditText)findViewById(R.id.EditText01);
       et.setText(ip);
   }    
   private String intToIp(int i) {      

         return (i & 0xFF ) + "." +      
       ((i >> 8 ) & 0xFF) + "." +      
       ((i >> 16 ) & 0xFF) + "." +      
       ( i >> 24 & 0xFF) ;
    }  
2.使用GPRS
首先,设置用户上网权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
其次,代码如下
public String getLocalIpAddress()
   {
       try
       {
           for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();)
           {
              NetworkInterface intf = en.nextElement();
              for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();)
              {
                  InetAddress inetAddress = enumIpAddr.nextElement();
                  if (!inetAddress.isLoopbackAddress())
                  {
                      return inetAddress.getHostAddress().toString();
                  }
              }
          }
       }
       catch (SocketException ex)
       {
           Log.e("WifiPreference IpAddress", ex.toString());
       }
       return null;
   }

----------------------------------------------------------------------------------
不知道其他应用的action main情况下启动他
Android 开发有时需要在一个应用中启动另一个应用,比如Launcher加载所有的已安装的程序的列表,当点击图标时可以启动另一个应用。
一般我们知道了另一个应用的包名和MainActivity的名字之后便可以直接通过如下代码来启动:
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);            
ComponentName cn = new ComponentName(packageName, className);            
intent.setComponent(cn);
startActivity(intent);

但是更多的时候,我们一般都不知道应用程序的启动Activity的类名,而只知道包名,我们可以通过ResolveInfo类来取得启动Acitivty的类名。

下面是实现代码:
private void openApp(String packageName) {
PackageInfo pi = getPackageManager().getPackageInfo(packageName, 0);

Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
resolveIntent.setPackage(pi.packageName);

List<ResolveInfo> apps = pm.queryIntentActivities(resolveIntent, 0);

ResolveInfo ri = apps.iterator().next();
if (ri != null ) {
String packageName = ri.activityInfo.packageName;
String className = ri.activityInfo.name;

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);

ComponentName cn = new ComponentName(packageName, className);

intent.setComponent(cn);
startActivity(intent);
}
}


android布局属性详解
  各种Layout用到的一些重要的属性

  第一类:属性值为true或false

  android:layout_centerHrizontal 水平居中

  android:layout_centerVertical 垂直居中

  android:layout_centerInparent 相对于父元素完全居中

  android:layout_alignParentBottom 贴紧父元素的下边缘

  android:layout_alignParentLeft 贴紧父元素的左边缘

  android:layout_alignParentRight 贴紧父元素的右边缘

  android:layout_alignParentTop 贴紧父元素的上边缘

  android:layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以父元素做参照物

  第二类:属性值必须为id的引用名“@id/id-name”

  android:layout_below 在某元素的下方

  android:layout_above 在某元素的的上方

  android:layout_toLeftOf 在某元素的左边

  android:layout_toRightOf 在某元素的右边

  android:layout_alignTop 本元素的上边缘和某元素的的上边缘对齐

  android:layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐

  android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐

  android:layout_alignRight 本元素的右边缘和某元素的的右边缘对齐

  第三类:属性值为具体的像素值,如30dip,40px

  android:layout_marginBottom 离某元素底边缘的距离

  android:layout_marginLeft 离某元素左边缘的距离

  android:layout_marginRight 离某元素右边缘的距离

  android:layout_marginTop 离某元素上边缘的距离

  EditText的android:hint

  设置EditText为空时输入框内的提示信息。

  android:gravity

  android:gravity属性是对该view 内容的限定.比如一个button 上面的text. 你可以设置该text 在view的靠左,靠右等位置.以button为例,android:gravity=”right”则button上面的文字靠右

  android:layout_gravity

  android:layout_gravity是用来设置该view相对与起父view 的位置.比如一个button 在linearlayout里,你想把该button放在靠左、靠右等位置就可以通过该属性设置.以button为例,android:layout_gravity=”right”则button靠右

  android:layout_alignParentRight

  使当前控件的右端和父控件的右端对齐。这里属性值只能为true或false,默认false。

  android:scaleType:

  android:scaleType是控制图片如何resized/moved来匹对ImageView的size。ImageView.ScaleType / android:scaleType值的意义区别:

  CENTER /center 按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示

  CENTER_CROP / centerCrop 按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)

  CENTER_INSIDE / centerInside 将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽

  FIT_CENTER / fitCenter 把图片按比例扩大/缩小到View的宽度,居中显示

  FIT_END / fitEnd 把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置

  FIT_START / fitStart 把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置

  FIT_XY / fitXY 把图片不按比例扩大/缩小到View的大小显示

  MATRIX / matrix 用矩阵来绘制,动态缩小放大图片来显示。

Android的电源管理部分,在纵向上分为四层:



第一部分:Application层

主要是利用Android Frameworks提供的API进行应用级的开发,需要注意的是相关权限的申明:

<uses-permission android:name="android.permission.WAKE_LOCK" />

< uses-permission android:name="android.permission.DEVICE_POWER" />

第二部分:Frameworks层

1.       / frameworks/base/core/java/android/os/PowerManager.java

v  PowerManager:提供对设备的电源进行管理

?  常见锁类型


Flag Value


CPU


Screen


Keyboard


PARTIAL_WAKE_LOCK


On


Off


Off


SCREEN_DIM_WAKE_LOCK


On


Dim


Off


SCREEN_BRIGHT_WAKE_LOCK


On


Bright


Off


FULL_WAKE_LOCK


On


Bright


Bright

?  附加锁类型:仅仅是对Screen有影响


Flag Value


Description


ACQUIRE_CAUSES_WAKEUP


This flag will force the screen and/or keyboard to turn on immediately.


ON_AFTER_RELEASE


If this flag is set, the user activity timer will be reset when the WakeLock is released, causing the illumination to remain on a bit longer

v  WakeLock:电源管理对象锁

v  Usage:

?  获取PowerManager实例PowerManager pm=(PowerManager) getSystemService(Context.POWER_SERVICE);  

?  获取PowerManager.WakeLock实例mWakeLock=pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TEST");

?  Device On

mWakeLock.acquire();

?  Device Off

mWakeLock.release();

2.       / frameworks/base/core/java/android/os/Power.java

提供一些电源管理的函数,如reboot()。其是JNI的上层接口,其往下调用android_os_power.cpp

3.       / frameworks/base/services/java/com/android/server/PowerManagerService.java

电源管理服务,AIDL接口IPowerManager的实现者。

第三部分:JNI层

/frameworks/base/core/jni/android_os_power.cpp

第四部分:Native层

/hardware/libhardware/power/power.c

与Linux kernel交互

第五部分:Linux驱动层

/drivers/android/power.c

第六部分:使用电源管理注意事项

1.       可在onCreate时设置该界面的电源管理,在onDestroy时取消设置

2.       可在onResume时设置该界面的电源管理,在onPause时取消设置

3.       注意设置是以Activity为单位,不是以应用为单位

4.       注意在AndroidManifest.xml中声明该应用有设置电源管理的权限

5.       注意加锁解锁要成对出现

6.       注意多个用途最好用多个锁,不要一锁多用,以免出错

7.       注意对运行在后台和异常时对锁的处理

8.       注意在网络连接或传输时最好加锁,以免传输被中断

http://www.rosoo.net/a/201012/10599.html

9.       注意加锁以保证程序逻辑




http://173.234.53.177/?paged=4

---------------------------------------------------

通过程序获取android系统手机的铃声和音量。同样,设置铃声和音量的方法也很简单!
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
//通话音量
     int max = am.getStreamMaxVolume( AudioManager.STREAM_VOICE_CALL );
     int current = am.getStreamVolume( AudioManager.STREAM_VOICE_CALL );
     Log.d(”VIOCE_CALL”, “max : ” + max + ” current : ” + current);
//系统音量
     max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_SYSTEM );
     current = mAudioManager.getStreamVolume( AudioManager.STREAM_SYSTEM );
     Log.d(”SYSTEM”, “max : ” + max + ” current : ” + current);
//铃声音量
     max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_RING );
     current = mAudioManager.getStreamVolume( AudioManager.STREAM_RING );
     Log.d(”RING”, “max : ” + max + ” current : ” + current);
//音乐音量
     max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_MUSIC );
     current = mAudioManager.getStreamVolume( AudioManager.STREAM_MUSIC );
     Log.d(”MUSIC”, “max : ” + max + ” current : ” + current);
//提示声音音量
     max = am.getStreamMaxVolume( AudioManager.STREAM_ALARM );
     current = sm.getStreamVolume( AudioManager.STREAM_ALARM );
     Log.d(”ALARM”, “max : ” + max + ” current : ” + current);
设置音量的方法也很简单,AudioManager提供了方法:
public void setStreamVolume(int streamType, int index, int flags)
其中 streamType 有内置的常量,可以在AudioManager里面查到相关的定义。 通过程序获取android系统手机的铃声和音量。同样,设置铃声和音量的方法也很简单!
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);



android中定义的dimension单位有以下这些:
px(Pixels ,像素):对应屏幕上的实际像素点。
in(Inches ,英寸):屏幕物理长度单位。
mm(Millimeters ,毫米):屏幕物理长度单位。
pt(Points ,磅):屏幕物理长度单位,1/72英寸。
dp(与密度无关的像素):逻辑长度单位,在 160 dpi 屏幕上,1dp=1px=1/160英寸。随着密度变化,对应的像素数量也变化,但并没有直接的变化比例。
dip:与dp相同,多用于Google示例中。
sp(与密度和字体缩放度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。





android在处理一写图片资源的时候,会进行一些类型的转换,现在有空整理一下:
1、Drawable → Bitmap
Java代码

public static Bitmap drawableToBitmap(Drawable drawable) {

Bitmap bitmap = Bitmap
.createBitmap(
drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight(),
drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
: Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
//canvas.setBitmap(bitmap);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
drawable.draw(canvas);
return bitmap;
}
2、从资源中获取Bitmap
Java代码

Resources res=getResources();

Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic);
3、Bitmap → byte[]
Java代码

private byte[] Bitmap2Bytes(Bitmap bm){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
return baos.toByteArray();
}

4、 byte[] → Bitmap

Java代码

private Bitmap Bytes2Bimap(byte[] b){
if(b.length!=0){
return BitmapFactory.decodeByteArray(b, 0, b.length);
}
else {
return null;
}
}



android:theme="@android:style/Theme.Dialog"   将一个Activity显示为对话框模式
android:theme="@android:style/Theme.NoTitleBar"  不显示应用程序标题栏
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"  不显示应用程序标题栏,并全屏
android:theme="@android:style/Theme.Light"  背景为白色
android:theme="@android:style/Theme.Light.NoTitleBar"  白色背景并无标题栏
android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen"  白色背景,无标题栏,全屏
android:theme="@android:style/Theme.Black"  背景黑色
android:theme="@android:style/Theme.Black.NoTitleBar"  黑色背景并无标题栏
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" 黑色背景,无标题栏,全屏
android:theme="@android:style/Theme.Wallpaper"  用系统桌面为应用程序背景
android:theme="@android:style/Theme.Wallpaper.NoTitleBar"  用系统桌面为应用程序背景,且无标题栏
android:theme="@android:style/Theme.Wallpaper.NoTitleBar.Fullscreen"  用系统桌面为应用程序背景,无标题栏,全屏
android:theme="@android:style/Translucent" 半透明效果
android:theme="@android:style/Theme.Translucent.NoTitleBar"  半透明并无标题栏
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"  半透明效果,无标题栏,全屏
android:theme="@android:style/Theme.Panel"
android:theme="@android:style/Theme.Light.Panel"


你可能感兴趣的:(android)