如何在一个apk中调用另外一个apk中的activity?
系统提供了很多可以直接调用的Activity,通过指定的Intent就可以调用,比如打开搜索的:
Java代码
  1. Intentintent=newIntent(Intent.ACTION_WEB_SEARCH);
  2. intent.putExtra(SearchManager.QUERY,"searchString")
  3. startActivity(intent);
[java] view plain copy
  1. Intentintent=newIntent(Intent.ACTION_WEB_SEARCH);
  2. intent.putExtra(SearchManager.QUERY,"searchString")
  3. startActivity(intent);

Intent.ACTION_WEB_SEARCH是一个字符串,是“搜索”这个Activity的标识,extra是传给这个activity的一些数据。发送出这个intent之后,系统根据action字符串Intent.ACTION_WEB_SEARCH知道了是要调用哪个activity,如果有重名,会弹出一个选择对话框。然后打开此activity,实现想要做的事情。
那么,我们自己怎么来实现呢。
首先,写一个activity,在AndroidManifest.xml里面的intent-filter中,给这个activity命名,
Xml代码
  1. <intent-filter>
  2. <actionandroid:name="chroya.foo"/>
  3. <categoryandroid:name="android.intent.category.DEFAULT"/>
  4. </intent-filter>
[xml] view plain copy
  1. <intent-filter>
  2. <actionandroid:name="chroya.foo"/>
  3. <categoryandroid:name="android.intent.category.DEFAULT"/>
  4. </intent-filter>

然后安装。安装完毕之后,你会发现,系统中找不到这个程序。别急,它确实安装在手机里面了,但是因为他不是main的,所以系统不会把他当做Application的入口程序。
而要想打开这个activity,只有知道它名字的人才可以。跟系统的intent一样使用。它的名字定义为"chroya.foo",所以,这里用这个字符串就可以调用它了:
Java代码
  1. Intentintent=newIntent("chroya.foo");
  2. startActivity(intent);
[java] view plain copy
  1. Intentintent=newIntent("chroya.foo");
  2. startActivity(intent);

用刚才举的那个系统的intent说明,它的activity里面使用getIntent().getBundleExtra(SearchManager.QUERY)来接收传递进来的搜索字符串参数。而这个SearchManager.QUERY是关键字。如果要自己实现这种功能,只需要定义好关键字,然后从BundleExtra中取就行了。

如何获取屏幕上正显示的activity?
用过ActivityManager的童鞋估计都知道,可以从ActivityManager里面可以获取到当前运行的所有任务,所有进程和所有服务,这是任务管理器的核心。
那么,从里面我们可以发掘点什么出来吗?
仔细看getRunningTasks的文档,里面说获取的是系统中"running"的所有task,"running"状态包括已经被系统冻结的task。而且返回的这个列表是按照顺序排列的,也就是说第一个肯定比第二个后运行。
getRunningTasks有个整型参数,表示返回列表的最大个数。那么,我们如果把1作为参数给进去,那么他返回的task就是当前运行的那个task,然后从task中获取到最顶层的activity,这个activity就是当前显示给用户的那个activity了。
Java代码
  1. ActivityManageram=(ActivityManager)getSystemService(ACTIVITY_SERVICE);
  2. ComponentNamecn=am.getRunningTasks(1).get(0).topActivity;
  3. Log.d("","pkg:"+cn.getPackageName());
  4. Log.d("","cls:"+cn.getClassName());
[java] view plain copy
  1. ActivityManageram=(ActivityManager)getSystemService(ACTIVITY_SERVICE);
  2. ComponentNamecn=am.getRunningTasks(1).get(0).topActivity;
  3. Log.d("","pkg:"+cn.getPackageName());
  4. Log.d("","cls:"+cn.getClassName());

至于这个能做什么,嘿嘿,我相信你知道的。

如何判断一个activity是否存在于系统中?
已知包名和类名,如何判断这个activity是否在系统中存在呢?很简单,通过intent就行。
Java代码
  1. Intentintent=newIntent();
  2. intent.setClassName("包名","类名");
  3. if(getPackageManager().resolveActivity(intent,0)==null){
  4. //说明系统中不存在这个activity
  5. }
[java] view plain copy
  1. Intentintent=newIntent();
  2. intent.setClassName("包名","类名");
  3. if(getPackageManager().resolveActivity(intent,0)==null){
  4. //说明系统中不存在这个activity
  5. }


如何让应用程序动态全屏和退出全屏?
让程序全屏的方法,大家都知道,那是静态的,程序运行之初就申明了。但是如果有这样的需求:要在程序运行的过程中,执行了某个操作而使之全屏,然后还需要退出全屏,怎么做?
如下:
Java代码
  1. WindowManager.LayoutParamsattrs=getWindow().getAttributes();
  2. attrs.flags|=WindowManager.LayoutParams.FLAG_FULLSCREEN;
  3. getWindow().setAttributes(attrs);
  4. getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
[java] view plain copy
  1. WindowManager.LayoutParamsattrs=getWindow().getAttributes();
  2. attrs.flags|=WindowManager.LayoutParams.FLAG_FULLSCREEN;
  3. getWindow().setAttributes(attrs);
  4. getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

修改window的LayoutParams参数,然后加上FLAG_LAYOUT_NO_LIMITS标志,就OK了。window会自动重新布局,呈现全屏的状态。
要退出全屏,只需要清除刚才加上的FLAG_FULLSCREEN参数,然后去掉FLAG_LAYOUT_NO_LIMITS标志。
如下:
Java代码
  1. WindowManager.LayoutParamsattrs=getWindow().getAttributes();
  2. attrs.flags&=(~WindowManager.LayoutParams.FLAG_FULLSCREEN);
  3. getWindow().setAttributes(attrs);
  4. getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
[java] view plain copy
  1. WindowManager.LayoutParamsattrs=getWindow().getAttributes();
  2. attrs.flags&=(~WindowManager.LayoutParams.FLAG_FULLSCREEN);
  3. getWindow().setAttributes(attrs);
  4. getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);


如何获取状态栏和标题栏的高度?
1.获取状态栏高度:
decorView是window中的最顶层view,可以从window中获取到decorView,然后decorView有个getWindowVisibleDisplayFrame方法可以获取到程序显示的区域,包括标题栏,但不包括状态栏。于是,我们就可以算出状态栏的高度了。
Java代码
  1. Rectframe=newRect();
  2. getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
  3. intstatusBarHeight=frame.top;
[java] view plain copy
  1. Rectframe=newRect();
  2. getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
  3. intstatusBarHeight=frame.top;

2.获取标题栏高度:
getWindow().findViewById(Window.ID_ANDROID_CONTENT)这个方法获取到的view就是程序不包括标题栏的部分,然后就可以知道标题栏的高度了。
Java代码
  1. intcontentTop=getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();
  2. //statusBarHeight是上面所求的状态栏的高度
  3. inttitleBarHeight=contentTop-statusBarHeight;
[java] view plain copy
  1. intcontentTop=getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();
  2. //statusBarHeight是上面所求的状态栏的高度
  3. inttitleBarHeight=contentTop-statusBarHeight;


如何将一个视窗(windows)盖在整个Application的最上面?
Java代码
  1. privateImageViewwaitView;
  2. privatefinalvoidshowWaiting(){
  3. try{
  4. WindowManager.LayoutParamslp=null;
  5. lp=newWindowManager.LayoutParams(
  6. ViewGroup.LayoutParams.WRAP_CONTENT,
  7. ViewGroup.LayoutParams.WRAP_CONTENT,
  8. WindowManager.LayoutParams.TYPE_TOAST,
  9. WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
  10. |WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
  11. |WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
  12. PixelFormat.TRANSLUCENT
  13. |WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW);
  14. WindowManagermWindowManager=(WindowManager)G.appInstance
  15. .getSystemService(Context.WINDOW_SERVICE);
  16. if(waitView==null){
  17. LayoutInflaterinflate=(LayoutInflater)G.appInstance
  18. .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  19. waitView=(ImageView)inflate.inflate(R.layout.waiting_layout,
  20. null);
  21. }
  22. mWindowManager.addView(waitView,lp);
  23. }catch(Throwablee){
  24. }
  25. }
[java] view plain copy
  1. privateImageViewwaitView;
  2. privatefinalvoidshowWaiting(){
  3. try{
  4. WindowManager.LayoutParamslp=null;
  5. lp=newWindowManager.LayoutParams(
  6. ViewGroup.LayoutParams.WRAP_CONTENT,
  7. ViewGroup.LayoutParams.WRAP_CONTENT,
  8. WindowManager.LayoutParams.TYPE_TOAST,
  9. WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
  10. |WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
  11. |WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
  12. PixelFormat.TRANSLUCENT
  13. |WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW);
  14. WindowManagermWindowManager=(WindowManager)G.appInstance
  15. .getSystemService(Context.WINDOW_SERVICE);
  16. if(waitView==null){
  17. LayoutInflaterinflate=(LayoutInflater)G.appInstance
  18. .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  19. waitView=(ImageView)inflate.inflate(R.layout.waiting_layout,
  20. null);
  21. }
  22. mWindowManager.addView(waitView,lp);
  23. }catch(Throwablee){
  24. }
  25. }

注意:
1. 要将window的类型配置成Type_toast。
2.G.appInstance 上下文需要使用Application的context.

如何判断快捷方式是否已经创建?
快捷方式信息是保存在com.android.launcher的launcher.db的favorites表中
Java代码
  1. booleanisInstallShortcut=false;
  2. finalContentResolvercr=context.getContentResolver();
  3. finalStringAUTHORITY="com.android.launcher.settings";
  4. finalUriCONTENT_URI=Uri.parse("content://"+
  5. AUTHORITY+"/favorites?notify=true");
  6. Cursorc=cr.query(CONTENT_URI,
  7. newString[]{"title","iconResource"},
  8. "title=?",
  9. newString[]{"XXX"},null);//XXX表示应用名称。
  10. if(c!=null&&c.getCount()>0){
  11. isInstallShortcut=true;
  12. }
  13. /*try{
  14. while(c.moveToNext()){
  15. Stringtmp="";
  16. tmp=c.getString(0);
  17. }
  18. }catch(Exceptione){
  19. }finally{
  20. c.close();
  21. }*/
  22. returnisInstallShortcut;
  23. }
[java] view plain copy
  1. booleanisInstallShortcut=false;
  2. finalContentResolvercr=context.getContentResolver();
  3. finalStringAUTHORITY="com.android.launcher.settings";
  4. finalUriCONTENT_URI=Uri.parse("content://"+
  5. AUTHORITY+"/favorites?notify=true");
  6. Cursorc=cr.query(CONTENT_URI,
  7. newString[]{"title","iconResource"},
  8. "title=?",
  9. newString[]{"XXX"},null);//XXX表示应用名称。
  10. if(c!=null&&c.getCount()>0){
  11. isInstallShortcut=true;
  12. }
  13. /*try{
  14. while(c.moveToNext()){
  15. Stringtmp="";
  16. tmp=c.getString(0);
  17. }
  18. }catch(Exceptione){
  19. }finally{
  20. c.close();
  21. }*/
  22. returnisInstallShortcut;
  23. }

要有权限:
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS"/>
注意:2.2及其之后的版本不能用这个方法判断!(虽然在launcher.db数据库里还有favorites这个表)

如何让ListView中TextView的字体颜色跟随焦点的变化?
我们通常需要ListView中某一项选中时,他的字体颜色和原来的不一样。 如何设置字体的颜色呢? 在布局文件中TextColor一项来设置颜色,但是不是只设置一种颜色,而是在不同的条件下设置不同的颜色: 下面是个例子:
Xml代码
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <selectorxmlns:android="http://schemas.android.com/apk/res/android">
  3. <itemandroid:state_enabled="false"android:color="@color/orange"></item>
  4. <itemandroid:state_window_focused="false"android:color="@color/orange"></item>
  5. <itemandroid:state_pressed="true"android:color="@color/white"></item>
  6. <itemandroid:state_selected="true"android:color="@color/white"></item>
  7. <itemandroid:color="@color/orange"></item>
  8. </selector>
  9. 在获取焦点或者选中的情况下设置为白色,其他情况设置为橘黄色。
[xml] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <selectorxmlns:android="http://schemas.android.com/apk/res/android">
  3. <itemandroid:state_enabled="false"android:color="@color/orange"></item>
  4. <itemandroid:state_window_focused="false"android:color="@color/orange"></item>
  5. <itemandroid:state_pressed="true"android:color="@color/white"></item>
  6. <itemandroid:state_selected="true"android:color="@color/white"></item>
  7. <itemandroid:color="@color/orange"></item>
  8. </selector>
  9. 在获取焦点或者选中的情况下设置为白色,其他情况设置为橘黄色。



如何在android的一个应用中调用另外一个应用?
Java代码
  1. Intentintent=newIntent();
  2. //第一个参数另一个应用的包名,第二个是需要启动的类
  3. intent.setComponent(newComponentName("com.Ex03_03","com.Ex03_03.Ex03_03"));
  4. startActivity(intent);
[java] view plain copy
  1. Intentintent=newIntent();
  2. //第一个参数另一个应用的包名,第二个是需要启动的类
  3. intent.setComponent(newComponentName("com.Ex03_03","com.Ex03_03.Ex03_03"));
  4. startActivity(intent);


如何遍历listView 的的单选框?
Java代码
  1. ListViewlistView=(ListView)findViewById(R.id.配置文件中ListView的ID);
  2. //全选遍历ListView的选项,每个选项就相当于布局配置文件中的RelativeLayout
  3. for(inti=0;i<listView.getChildCount();i++){
  4. Viewview=listView.getChildAt(i);
  5. CheckBoxcb=(CheckBox)view.findViewById(R.id.CheckBoxID);
  6. cb.setChecked(true);
  7. }
[java] view plain copy
  1. ListViewlistView=(ListView)findViewById(R.id.配置文件中ListView的ID);
  2. //全选遍历ListView的选项,每个选项就相当于布局配置文件中的RelativeLayout
  3. for(inti=0;i<listView.getChildCount();i++){
  4. Viewview=listView.getChildAt(i);
  5. CheckBoxcb=(CheckBox)view.findViewById(R.id.CheckBoxID);
  6. cb.setChecked(true);
  7. }


如何获取程序版本号?
Java代码
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <manifestxmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.yourcompany.yourapp"
  4. android:versionCode="109"
  5. android:versionName="0.1.6.109dev">
  6. ...
  7. </manifest>
  8. publicstaticintgetVersionCode(Contextcontext){
  9. PackageManagerpm=context.getPackageManager();
  10. try{
  11. PackageInfopi=pm.getPackageInfo(context.getPackageName(),0);
  12. returnpi.versionCode;
  13. }catch(NameNotFoundExceptionex){}
  14. return0;
  15. }
[java] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <manifestxmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.yourcompany.yourapp"
  4. android:versionCode="109"
  5. android:versionName="0.1.6.109dev">
  6. ...
  7. </manifest>
  8. publicstaticintgetVersionCode(Contextcontext){
  9. PackageManagerpm=context.getPackageManager();
  10. try{
  11. PackageInfopi=pm.getPackageInfo(context.getPackageName(),0);
  12. returnpi.versionCode;
  13. }catch(NameNotFoundExceptionex){}
  14. return0;
  15. }


如何让Toast充满全屏?
Java代码
  1. Toastt=Toast.makeText(this,"Hello",Toast.LENGTH_SHORT);
  2. t.setGravity(Gravity.FILL_HORIZONTAL,0,0);
[java] view plain copy
  1. Toastt=Toast.makeText(this,"Hello",Toast.LENGTH_SHORT);
  2. t.setGravity(Gravity.FILL_HORIZONTAL,0,0);


如何更高效简单的实现界面中的分隔线?
Java代码
  1. <View
  2. android:layout_width="fill_parent"
  3. android:layout_height="1px"
  4. android:background="?android:attr/listDivider"
  5. />
[java] view plain copy
  1. <View
  2. android:layout_width="fill_parent"
  3. android:layout_height="1px"
  4. android:background="?android:attr/listDivider"
  5. />


如何发起或删除另一个程序?
Java代码
  1. finalIntentintent=newIntent(Intent.ACTION_MAIN,null);
  2. intent.addCategory(Intent.CATEGORY_LAUNCHER);
  3. finalComponentNamecn=newComponentName("com.android.settings","com.android.settings.fuelgauge.PowerUsageSummary");
  4. intent.setComponent(cn);
  5. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  6. startActivity(intent);
[java] view plain copy
  1. finalIntentintent=newIntent(Intent.ACTION_MAIN,null);
  2. intent.addCategory(Intent.CATEGORY_LAUNCHER);
  3. finalComponentNamecn=newComponentName("com.android.settings","com.android.settings.fuelgauge.PowerUsageSummary");
  4. intent.setComponent(cn);
  5. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  6. startActivity(intent);

Java代码
  1. //ComponentName两个参数一个是包名一个是包下的主类
  2. Uriuri=Uri.fromParts("package",“YourPackagenamehere”,null);
  3. IntentdeleteIntent=newIntent(Intent.ACTION_DELETE,uri);
  4. startActivity(deleteIntent);
[java] view plain copy
  1. //ComponentName两个参数一个是包名一个是包下的主类
  2. Uriuri=Uri.fromParts("package",“YourPackagenamehere”,null);
  3. IntentdeleteIntent=newIntent(Intent.ACTION_DELETE,uri);
  4. startActivity(deleteIntent);


如何为TextView添加阴影?
values/styles
Xml代码
  1. <stylename="AudioFileInfoOverlayText">
  2. <itemname="android:paddingLeft">4px</item>
  3. <itemname="android:paddingBottom">4px</item>
  4. <itemname="android:textColor">#ffffffff</item>
  5. <itemname="android:textSize">12sp</item>
  6. <itemname="android:shadowColor">#ff00ff00</item>
  7. <itemname="android:shadowDx">5</item>
  8. <itemname="android:shadowDy">3</item>
  9. <itemname="android:shadowRadius">6</item>
  10. </style>
[xml] view plain copy
  1. <stylename="AudioFileInfoOverlayText">
  2. <itemname="android:paddingLeft">4px</item>
  3. <itemname="android:paddingBottom">4px</item>
  4. <itemname="android:textColor">#ffffffff</item>
  5. <itemname="android:textSize">12sp</item>
  6. <itemname="android:shadowColor">#ff00ff00</item>
  7. <itemname="android:shadowDx">5</item>
  8. <itemname="android:shadowDy">3</item>
  9. <itemname="android:shadowRadius">6</item>
  10. </style>

<TextView android:id="@+id/info"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
style="@style/AudioFileInfoOverlayText"
android:text="aaaa"
android:gravity="center" />

如何监测是否静音?
Java代码
  1. AudioManageram=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
  2. switch(am.getRingerMode()){
  3. caseAudioManager.RINGER_MODE_SILENT:
  4. Log.i("MyApp","Silentmode");
  5. break;
  6. caseAudioManager.RINGER_MODE_VIBRATE:
  7. Log.i("MyApp","Vibratemode");
  8. break;
  9. caseAudioManager.RINGER_MODE_NORMAL:
  10. Log.i("MyApp","Normalmode");
  11. break;
  12. }
[java] view plain copy
  1. AudioManageram=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
  2. switch(am.getRingerMode()){
  3. caseAudioManager.RINGER_MODE_SILENT:
  4. Log.i("MyApp","Silentmode");
  5. break;
  6. caseAudioManager.RINGER_MODE_VIBRATE:
  7. Log.i("MyApp","Vibratemode");
  8. break;
  9. caseAudioManager.RINGER_MODE_NORMAL:
  10. Log.i("MyApp","Normalmode");
  11. break;
  12. }


如何设置控件的随机显示位置?
Java代码
  1. RelativeLayout.LayoutParamsparms=(RelativeLayout.LayoutParams)img.getLayoutParams();
  2. parms.leftMargin=(int)(Math.random()*320);
  3. parms.topMargin=(int)(Math.random()*480);
  4. img.setLayoutParams(parms);
  5. img.invalidate();
[java] view plain copy
  1. RelativeLayout.LayoutParamsparms=(RelativeLayout.LayoutParams)img.getLayoutParams();
  2. parms.leftMargin=(int)(Math.random()*320);
  3. parms.topMargin=(int)(Math.random()*480);
  4. img.setLayoutParams(parms);
  5. img.invalidate();


如何让软键盘显示/消失?
Java代码
  1. InputMethodManagerimm=(InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
  2. Viewview=getCurrentFocus();
  3. if(view!=null){
  4. //imm.showSoftInput(view,0);//显示软键盘
  5. imm.toggleSoftInput(0,InputMethodManager.HIDE_NOT_ALWAYS);
  6. //imm.hideSoftInputFromWindow(view.getWindowToken(),0);//隐藏软键盘//InputMethodManager.HIDE_NOT_ALWAYS);
  7. }
[java] view plain copy
  1. InputMethodManagerimm=(InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
  2. Viewview=getCurrentFocus();
  3. if(view!=null){
  4. //imm.showSoftInput(view,0);//显示软键盘
  5. imm.toggleSoftInput(0,InputMethodManager.HIDE_NOT_ALWAYS);
  6. //imm.hideSoftInputFromWindow(view.getWindowToken(),0);//隐藏软键盘//InputMethodManager.HIDE_NOT_ALWAYS);
  7. }


如何为Activity屏幕的标题栏添加图标?
Java代码
  1. @Override
  2. publicvoidonCreate(Bundleicicle){
  3. super.onCreate(icicle);
  4. Windowwin=getWindow();
  5. win.requestFeature(Window.FEATURE_LEFT_ICON);
  6. setContentView(R.layout.mylayout);
  7. win.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON,R.drawable.icon);
  8. }
[java] view plain copy
  1. @Override
  2. publicvoidonCreate(Bundleicicle){
  3. super.onCreate(icicle);
  4. Windowwin=getWindow();
  5. win.requestFeature(Window.FEATURE_LEFT_ICON);
  6. setContentView(R.layout.mylayout);
  7. win.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON,R.drawable.icon);
  8. }

要注意的是,win.setFeatureDrawableResource必须在setContentView之后,不然就没有效果。

如何让ListView自动滚动?
注意stackFromBottom以及transcriptMode这两个属性。类似Market客户端的低端不断滚动。
<ListView android:id="listCWJ"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:stackFromBottom="true"
android:transcriptMode="alwaysScroll"
/>

如何设置桌面壁纸?
希望在你的程序中能设置桌面壁纸吗?很简单,首先我们需要取得设置壁纸的权限。和其它权限一样,只要在配置文件中加上以下配置信息即可。
<uses-permission android:name="android.permission.SET_WALLPAPER" />
然后在程序中调用如下代码即可设置桌面壁纸:
getApplicationContext().setWallpaper(bitmap)

如何在标题栏(titlebar)显示进度条?
Java代码
  1. protectedvoidonCreate(BundlesavedInstanceState){
  2. super.onCreate(savedInstanceState);
  3. requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);//先给Activity注册界面进度条功能
  4. setContentView(R.layout.main);
  5. setProgressBarIndeterminateVisibility(true);//在需要显示进度条的时候调用这个方法
  6. setProgressBarIndeterminateVisibility(false);//在不需要显示进度条的时候调用这个方法
  7. }
[java] view plain copy
  1. protectedvoidonCreate(BundlesavedInstanceState){
  2. super.onCreate(savedInstanceState);
  3. requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);//先给Activity注册界面进度条功能
  4. setContentView(R.layout.main);
  5. setProgressBarIndeterminateVisibility(true);//在需要显示进度条的时候调用这个方法
  6. setProgressBarIndeterminateVisibility(false);//在不需要显示进度条的时候调用这个方法
  7. }


如何去掉activity顶部的gradient?
<style name="Theme.Foo" parent="android:style/Theme.Light">
<item name="android:windowContentOverlay">@null</item>
</style>
<activity android:name=".FooActivity"
android:theme="@style/Theme.Foo"> ...
http://wang-peng1.iteye.com/blog/680015

如何让ScrollView强制滑到底部?
scroll.fullScroll(View.FOCUS_DOWN) 就可以了

如何ViewFlipper去掉多余空间?
ViewFlipper flipper = (ViewFlipper)findViewById(R.id.flipper);
flipper.setMeasureAllChildren(false);

如何去掉tabhost横线?
Java代码
  1. 很简单简单的有时候是因为我们太浮躁
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. android:gravity="center_horizontal">
  7. <TabHost
  8. android:id="@android:id/tabhost"
  9. android:layout_width="fill_parent"
  10. android:layout_height="fill_parent"
  11. >
  12. ...
  13. ...
  14. ...
  15. </TabHost>
  16. </LinearLayout>
  17. 外面加一层LinearLayout
[java] view plain copy
  1. 很简单简单的有时候是因为我们太浮躁
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. android:gravity="center_horizontal">
  7. <TabHost
  8. android:id="@android:id/tabhost"
  9. android:layout_width="fill_parent"
  10. android:layout_height="fill_parent"
  11. >
  12. ...
  13. ...
  14. ...
  15. </TabHost>
  16. </LinearLayout>
  17. 外面加一层LinearLayout


如何判断国家?
Java代码
  1. Stringlocale=context.getResources().getConfiguration().locale.getCountry();
  2. Stringlocale=context.getResources().getConfiguration().locale.getDisplayCountry();
  3. TelephonyManagertm=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
  4. StringcountryCode=tm.getSimCountryIso();
[java] view plain copy
  1. Stringlocale=context.getResources().getConfiguration().locale.getCountry();
  2. Stringlocale=context.getResources().getConfiguration().locale.getDisplayCountry();
  3. TelephonyManagertm=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
  4. StringcountryCode=tm.getSimCountryIso();


如何让屏幕保持一直亮?
Java代码
  1. @Override
  2. protectedvoidonCreate(Bundleicicle){
  3. super.onCreate(icicle);
  4. getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  5. }
[java] view plain copy
  1. @Override
  2. protectedvoidonCreate(Bundleicicle){
  3. super.onCreate(icicle);
  4. getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  5. }

http://wang-peng1.iteye.com/blog/769561

如何检查sim卡状态?
Java代码
  1. TelephonyManagertelMgr=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
  2. intsimState=telMgr.getSimState();
  3. switch(simState){
  4. caseTelephonyManager.SIM_STATE_ABSENT:
  5. //dosomething
  6. break;
  7. caseTelephonyManager.SIM_STATE_NETWORK_LOCKED:
  8. //dosomething
  9. break;
  10. caseTelephonyManager.SIM_STATE_PIN_REQUIRED:
  11. //dosomething
  12. break;
  13. caseTelephonyManager.SIM_STATE_PUK_REQUIRED:
  14. //dosomething
  15. break;
  16. caseTelephonyManager.SIM_STATE_READY:
  17. //dosomething
  18. break;
  19. caseTelephonyManager.SIM_STATE_UNKNOWN:
  20. //dosomething
  21. break;
  22. }
[java] view plain copy
  1. TelephonyManagertelMgr=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
  2. intsimState=telMgr.getSimState();
  3. switch(simState){
  4. caseTelephonyManager.SIM_STATE_ABSENT:
  5. //dosomething
  6. break;
  7. caseTelephonyManager.SIM_STATE_NETWORK_LOCKED:
  8. //dosomething
  9. break;
  10. caseTelephonyManager.SIM_STATE_PIN_REQUIRED:
  11. //dosomething
  12. break;
  13. caseTelephonyManager.SIM_STATE_PUK_REQUIRED:
  14. //dosomething
  15. break;
  16. caseTelephonyManager.SIM_STATE_READY:
  17. //dosomething
  18. break;
  19. caseTelephonyManager.SIM_STATE_UNKNOWN:
  20. //dosomething
  21. break;
  22. }


如何从SMS获取联系人信息?
Java代码
  1. ContactItemgetContactByAddr(Contextcontext,finalSMSItemsms){
  2. UripersonUri=Uri.withAppendedPath(
  3. ContactsContract.PhoneLookup.CONTENT_FILTER_URI,sms.mAddress);
  4. Cursorcur=context.getContentResolver().query(personUri,
  5. newString[]{PhoneLookup.DISPLAY_NAME},
  6. null,null,null);
  7. if(cur.moveToFirst()){
  8. intnameIdx=cur.getColumnIndex(PhoneLookup.DISPLAY_NAME);
  9. ContactItemitem=newContactItem();
  10. item.mName=cur.getString(nameIdx);
  11. cur.close();
  12. returnitem;
  13. }
  14. returnnull;
  15. }
[java] view plain copy
  1. ContactItemgetContactByAddr(Contextcontext,finalSMSItemsms){
  2. UripersonUri=Uri.withAppendedPath(
  3. ContactsContract.PhoneLookup.CONTENT_FILTER_URI,sms.mAddress);
  4. Cursorcur=context.getContentResolver().query(personUri,
  5. newString[]{PhoneLookup.DISPLAY_NAME},
  6. null,null,null);
  7. if(cur.moveToFirst()){
  8. intnameIdx=cur.getColumnIndex(PhoneLookup.DISPLAY_NAME);
  9. ContactItemitem=newContactItem();
  10. item.mName=cur.getString(nameIdx);
  11. cur.close();
  12. returnitem;
  13. }
  14. returnnull;
  15. }


如何在使用gallery在flinging拖动时候不出现选择的情况?
这时候需要注意使用
gallery.setCallbackDuringFling(false)

TabHost组件,怎么调整tab的高度?
Java代码
  1. TabWidgettabWidget=mTabHost.getTabWidget();
  2. intcount=tabWidget.getChildCount();
  3. for(inti=0;i<count;i++){
  4. Viewview=tabWidget.getChildTabViewAt(i);//tabWidget.getChildAt(i);
  5. view.getLayoutParams().height=40;
  6. }
[java] view plain copy
  1. TabWidgettabWidget=mTabHost.getTabWidget();
  2. intcount=tabWidget.getChildCount();
  3. for(inti=0;i<count;i++){
  4. Viewview=tabWidget.getChildTabViewAt(i);//tabWidget.getChildAt(i);
  5. view.getLayoutParams().height=40;
  6. }


如何模拟SDcard?
看图:


应该能看明白。

如何自定义ListView行间的分割线?
在Android平台中系统控件提供了灵活的自定义选项,所有基于ListView或者说AbsListView实现的widget控件均可以通过下面的方法设置行间距的分割线,分割线可以自定义颜色、或图片。
在ListView中我们使用属性 android:divider="#FF0000" 定义分隔符为红色,当然这里值可以指向一个drawable图片对象,如果使用了图片可能高度大于系统默认的像素,可以自己设置高度比如6个像素 android:dividerHeight="6px" ,Android开发网提示当然在Java中ListView也有相关方法可以设置。

如何在EditText中显示隐藏Android输入法窗口?
细心的网友可能发现我们在使用EditText时,会自动的弹出输入法面板,这里我们提供多种方法可以不让程序默认升起IME窗口。
1.让EditText失去焦点,使用EditText的clearFocus方法
2. 强制隐藏Android输入法窗口,在IME类中我们通过
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 实例化输入法控制对象,通过hideSoftInputFromWindow来控制,其中第一个参数绑定的为需要隐藏输入法的EditText对象,比如imm.hideSoftInputFromWindow(etAndroid123.getWindowToken(), 0);

如何实现TextView多行本文滚动?
Android中我们为了实现文本的滚动可以在ScrollView中嵌入一个TextView,其实TextView自己也可以实现多行滚动的,毕竟ScrollView必须只能有一个直接的子类布局。只要在layout中简单设置几个属性就可以轻松实现
<TextView
android:id="@+id/tvCWJ"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical" <!--垂直滚动条 -->
android:singleLine="false" <!--实现多行 -->
android:maxLines="15" <!--最多不超过15行 -->
android:textColor="#FF0000"
/>
当然我们为了让TextView动起来,还需要用到TextView的setMovementMethod方法设置一个滚动实例,代码如下
TextView tvAndroid123 = (TextView)findViewById(R.id.tvCWJ);
tvAndroid123.setMovementMethod(ScrollingMovementMethod.getInstance());

如何对View截屏?
对于自己的View实现一些绘图或子类化的技术时可以不用系统级这样的方法,我们可以通过
view.setDrawingCacheEnabled(true); //其中View是你需要截图的的View
Bitmap bm = view.getDrawingCache();

如何区别onRetainNonConfigurationInstance和getLastNonConfigurationInstance?
很多网友可能知道Android横竖屏切换时会触发onSaveInstanceState,而还原时会产生onRestoreInstanceState,但是Android的Activity类还有一个方法名为onRetainNonConfigurationInstance和getLastNonConfigurationInstance这两个方法。
我们可以通过 onRetainNonConfigurationInstance 代替 onSaveInstanceState,比如距离2
@Override
public Object onRetainNonConfigurationInstance()
{
//这里需要保存的内容,在切换时不是bundle了,我们可以直接通过Object来代替
return obj;
}

在恢复窗口时,我们可以不使用 onRestoreInstanceState,而代替的是 getLastNonConfigurationInstance 方法。我们可以直接在onCreate中使用,比如
Object obj = getLastNonConfigurationInstance(); 最终obj的内容就是上次切换时的内容。
这里Android123提醒大家,每次Activity横竖屏切换时onCreate方法都会被触发。

如何区别AsyncTask和Thread+Handler?
很多网友可能发现Android平台很多应用使用的都是AsyncTask,而并非Thread和Handler去更新UI,这里Android123给大家说下他们到底有什么区别,我们平时应该使用哪种解决方案。从Android 1.5开始系统将AsyncTask引入到android.os包中,过去在很早1.1和1.0 SDK时其实官方将其命名为UserTask,其内部是JDK 1.5开始新增的concurrent库,做过J2EE的网友可能明白并发库效率和强大性,比Java原始的Thread更灵活和强大,但对于轻量级的使用更为占用系统资源。Thread是Java早期为实现多线程而设计的,比较简单不支持concurrent中很多特性在同步和线程池类中需要自己去实现很多的东西,对于分布式应用来说更需要自己写调度代码,而为了Android UI的刷新Google引入了Handler和Looper机制,它们均基于消息实现,有事可能消息队列阻塞或其他原因无法准确的使用。

Android开发网推荐大家使用AsyncTask代替Thread+Handler的方式,不仅调用上更为简单,经过实测更可靠一些,Google在Browser中大量使用了异步任务作为处理耗时的I/O操作,比如下载文件、读写数据库等等,它们在本质上都离不开消息,但是AsyncTask相比Thread加Handler更为可靠,更易于维护,但AsyncTask缺点也是有的比如一旦线程开启即dobackground方法执行后无法给线程发送消息,仅能通过预先设置好的标记来控制逻辑,当然可以通过线程的挂起等待标志位的改变来通讯,对于某些应用Thread和Handler以及Looper可能更灵活。

如何使多个Drawable叠加(合成图片)?
大家可能知道Bitmap的叠加处理在Android平台中可以通过Canvas一层一层的画就行了,而Drawable中如何处理呢? 除了使用BitmapDrawable的getBitmap方法将Drawable转换为Bitmap外,今天Android123给大家说下好用简单的LayerDrawable类,LayerDrawable顾名思义就是层图形对象。下面直接用一个简单的代码表示:
Java代码
  1. Bitmapbm=BitmapFactory.decodeResource(getResources(),R.drawable.cwj);
  2. Drawable[]array=newDrawable[3];
  3. array[0]=newPaintDrawable(Color.BLACK);//黑色
  4. array[1]=newPaintDrawable(Color.WHITE);//白色
  5. array[2]=newBitmapDrawable(bm);//位图资源
  6. LayerDrawableld=newLayerDrawable(array);//参数为上面的Drawable数组
  7. ld.setLayerInset(1,1,1,1,1);//第一个参数1代表数组的第二个元素,为白色
  8. ld.setLayerInset(2,2,2,2,2);//第一个参数2代表数组的第三个元素,为位图资源
  9. mImageView.setImageDrawable(ld);
[java] view plain copy
  1. Bitmapbm=BitmapFactory.decodeResource(getResources(),R.drawable.cwj);
  2. Drawable[]array=newDrawable[3];
  3. array[0]=newPaintDrawable(Color.BLACK);//黑色
  4. array[1]=newPaintDrawable(Color.WHITE);//白色
  5. array[2]=newBitmapDrawable(bm);//位图资源
  6. LayerDrawableld=newLayerDrawable(array);//参数为上面的Drawable数组
  7. ld.setLayerInset(1,1,1,1,1);//第一个参数1代表数组的第二个元素,为白色
  8. ld.setLayerInset(2,2,2,2,2);//第一个参数2代表数组的第三个元素,为位图资源
  9. mImageView.setImageDrawable(ld);

上面的方法中LayerDrawable是关键,Android开发网提示setLayerInset方法原型为public void setLayerInset (int index, int l, int t, int r, int b) 其中第一个参数为层的索引号,后面的四个参数分别为left、top、right和bottom。对于简单的图片合成我们可以将第一和第二层的PaintDrawable换成BitmapDrawable即可实现简单的图片合成。

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. 关于android中自定义SurfaceView放在布局文件中的问题
  3. Android通过主题样式更改标题栏颜色以及文字大小和颜色
  4. Android(安卓)电话 短信
  5. android 4.3以上修改DNS 及 流程(netd)
  6. Android源码个个击破之PackageManager
  7. Android(安卓)Studio&源码混淆配置及其调试注意事项
  8. 利用签名机制进行程序自检——Android防破解
  9. Android(安卓)9.0 蓝牙配对流程

随机推荐

  1. android selector的用法解析
  2. Android 超级用户工具箱
  3. 10个很棒的学习Android 开发的网站
  4. Android应用开发工程师项目实战 共18章(
  5. android基础控件学习学习(1)【入门篇】
  6. android里面EditTex多行输入及输入置顶问
  7. Android菜鸟的成长笔记(17)—— 再看Androi
  8. Android 内存泄漏优化汇总
  9. Android 界面中隐藏项目名称
  10. android提示:Gradle DSL method not found