学习点滴(二)

case1:如何在Android App中屏蔽Home按键
编写一个Acitivity, 屏蔽HOME按键,在onAttachedToWindow中设置TYPE_KEYGUARD_DIALOG
比如
public class myActivity extends Activity {
  @Override
    public void onAttachedToWindow()
    {
        super.onAttachedToWindow();
        this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
    }

  }

case2:如何防止一个控件被过快重复点击

在android开发中,为防止控件过快点击,需要确保有效点击,即在有效时间内只记下一次点击事件  

private boolean processFlag = true; //默认可以点击  
//b_next 那个被点击的控件  
b_next.setOnClickListener(new OnClickListener() { 
          public void onClick(View v) { 
              if (processFlag) { 
                  setProcessFlag();//  
                  toNext();// 去执行的具体操作  
                  new TimeThread().start(); 
              } 
          } 
      }); 
/**
   * 设置按钮在短时间内被重复点击的有效标识(true表示点击有效,false表示点击无效)
   */ 
  private synchronized void setProcessFlag() { 
      processFlag = false; 
  } 
 
  /**
   * 计时线程(防止在一定时间段内重复点击按钮)
   */ 
  private class TimeThread extends Thread { 
      public void run() { 
          try { 
              sleep(1000); 
              processFlag = true; 
          } catch (Exception e) { 
              e.printStackTrace(); 
          } 
      } 
  }  

case3:android 4.1 版本以上的latin输入法如何修改各语言键盘显示字符

1.修改对应语言的如下目录的xml

packages/inputmethods/LatinIME/tools/maketext/res/values-XXX/donottranslate-more-keys.xml

2.回到代码根目录,执行

    1) mmm packages/inputmethods/LatinIME/tools/maketext

    2)maketext -java packages/inputmethods/LatinIME/java/src

   即会直接根据对tools文件下各语言键盘的修改而修改代码     (java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java

3.重新编译 Latin 模块

case4:如何判断是否为支持的音频文件格式为损坏音频文件

Android提供了MediaMetadataRetriever类,由JNI(media_jni)实现。通过它可以取得视频及音乐的frame 及 meta data
用一个简单的例子说明如何通过它判断是否是支持的音频文件格式为损坏的音频文件

    private boolean isMediaAvaliable(Uri uri) {
        if (uri == null)
            return true;
        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        try {
            retriever.setDataSource(getContext(), uri);
        } catch (Exception ex) {
            ex.printStackTrace();
            return false;
        } finally {
            retriever.release();
        }
        return true;
    }

case5:android插入耳机状态如何使用扬声器外放音乐?

调用setSpeakerphoneOn,强制外放。

参考代码:

AudioManager audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
audioManager.setMicrophoneMute(false);
audioManager.setSpeakerphoneOn(true);//使用扬声器外放,即使已经插入耳机
setVolumeControlStream(AudioManager.STREAM_MUSIC);//控制声音的大小
audioManager.setMode(AudioManager.STREAM_MUSIC);

case6:Android音量控制调节接口如何调用

//音量控制,初始化定义 
    AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
    //最大音量 
    int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); 
    //当前音量 
    int currentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 

直接控制音量的多少:
    if(isSilent){ 
      mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0); 
    }else{ 
      mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, tempVolume, 0); //tempVolume:音量绝对值 
    } 

以一步步长控制音量的增减,并弹出系统默认音量控制条:

//降低音量,调出系统音量控制 
if(flag == 0){ 
  mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_LOWER, 
                            AudioManager.FX_FOCUS_NAVIGATION_UP); 

//增加音量,调出系统音量控制 
else if(flag == 1){ 
  mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_RAISE, 
                            AudioManager.FX_FOCUS_NAVIGATION_UP); 

c ase 7: 为什么音乐应用中一些音乐显示的名字与实际文件的文件名不一致?

音乐显示的名称默认不是文件名。
而是数据库的的title字段。

媒体扫描若发现在MP3中有ID3的音频标签,会解析这些标签。其中一个标签为标题,这就放在title字段。
一些标签中还有专辑图片,也会解析出来。

case8:如何直接屏蔽掉耳机上的接听键

耳机接听键短按SoundRecorder的onKeyDown可以接收到,利用keyCode == KeyEvent.KEYCODE_HEADSETHOOK可以区分,但是如果长按耳机接听键,底层对耳机长按的处理是不停的发送RepeatCount,并且RepeatCount不停的增加,所以会不停的触发SoundRecorder的onKeyDown,导致录音机不停的在暂停和播放之间切换。解决这个问题可以直接屏蔽掉耳机接听键事件,如果想区分可以参考Music的MediaButtonIntentReceiver,通过event.getRepeatCount()来获得RepeatCount,区分短按和长按事件。

case9:视频播放过程中,如何使用DDMS进行视频截屏

DDMS显示的是framebuffer的数据,而video layer 走的是overlay,所以需要禁掉overlay, 走framebuffer分支。 手动禁掉overlay的方法是:设置 -->开发人员选项--> 选中"停用HW叠加层",如此操作之后才可以使用DDMS进行视频截屏。

case10:什么是派对随机播放

派对就是party的意思,开启派对随机播放后,会在音乐库中随机选择部分歌曲组成一个派对放至播放列表中并按顺序播放。它的特点就是播放时不会随机到重复的歌曲。

case11:为什么在文件管理器中更改音乐名称后,再回到播放器有些歌曲名称可更新,有些不可

音乐播放器中歌曲名称会根据音乐文件中是否含有id3信息来获取歌曲名,在获取不到的情况下,歌曲会显示为文件名称。所以要在此歌曲不含id3信息的情况下,播放器中歌曲名才会随文件名而变化

case 12:使用MediaPlayer类和SoundPool类播放音频差别

在Android应用开发中,如果需要播放音频该怎么办呢?这里可以有两种播放方式,一个是MediaPlayer类,另一个是SoundPool类。当然还有AudioTrack,但它是对PCM数据的直接操作,所以应用开发中很少用它去播放音频

、播放音频的实现

    MediaPlayer 播放音频的实现步骤:
       1、调用MediaPlayer.create(context, R.raw.mid);

             播放应用中事先自带的resource资源;利用MediaPlayer类调用create方法并且传入

             通过id索引的资源音频文件,得到实例;
       2、得到的实例就可以调用 MediaPlayer.star();

    SoundPool 播放音频的实现步骤:
       1、new出一个实例:new SoundPool(4, AudioManager.STREAM_MUSIC,100);

            第一个参数是允许有多少个声音流同时播放,第2个参数是声音类型,第三个参数是声音的品质;
       2、loadId = soundPool.load(context, R.raw.himi_ogg, 1);
       3、使用实例调用soundPool.play方法传入对应的音频文件id即可!

两种播放方式的利弊

MediaPlayer播放,它是不支持实时播放多个声音的,会出现或多或少的延迟,尤其是在快速连续播放声音(比如连续猛点按钮)时,会非常明显的延迟。

SoundPool最大只能申请1M的内存空间,这就意味着我们只能使用一些很短的声音片段,而不是用它来播放歌曲或者游戏背景音乐。在使用SoundPool播放音频的时候,如果在初始化中就调用播放函数进行播放音乐那么根本没有声音,不是因为没有执行,而是SoundPool需要一准备时间load播放音频

总结就是SoundPool适合做特效声,播放背景音乐还是用MediaPlayer比较好。

case13:后台播放音乐,进入文件管理器找到正在播放的音乐并删除,为什么音乐还能继续播放

android原生设计如此,音乐播放已将音乐文件打开,后虽用文件管理器删除,但根据Linux文件系统实现原理可知,只有等没有任何进程访问此文件时才真正删除,而此时音乐尚在访问文件,因此文件还没有真正被删除。

case14:android如何在横竖屏切换时不重新走生命周期

Activity布局从横屏LANDSCAPE切换到PORTRAIT,会重新触发一次onCreate方法,我们可以在androidmanifest.xml中的activit元素加入这个属性 android:configChanges="orientation|keyboardHidden" ,同时在Activity的Java文件中重载onConfigurationChanged(Configuration  newConfig)这个方法,这样就不会在布局切换或窗口切换时重载onCreate等方法。

case15:长按home键会显示最近运行列表,如何使activity不显示在最近运行列表里面

在AndroidManifest.xml中配置activity属性时,可以添加android:excludeFromRecents="true",

此值设置为true,就可以排除在最近任务列表之外了。

case16:AudioFocus中的OnAudioFocusChangeListener参数的隐藏作用

OnAudioFocusChangeListener是作为监听器来监听声音焦点的改变的,但它还有一个隐藏作用就是绑定当前获得焦点的应用,如果在申请/释放AudioFocus时不传入统一的OnAudioFocusChangeListener,而使用null来代替就有可能出现申请/释放AudioFocus的应用不一致,应该释放AudioFocus的应用没释放,不应该释放AudioFocus的反而释放了。所以,每个要使用AudioFocus的程序都要小心实现这个函数,保证AudioFocus实现的一致性。


case17:如何在代码中判断当前版本是user版本还是userdebug版本?

获取Build.java中的TYPE。

public static final String TYPE = getString("ro.build.type");

去判断一下获取的type是user还是userdebug。

userdebug版本对应type为userdebug

user版本对应为user

比如:userdebug版本,adb shell,进入终端,输入getprop,可以看已其[ro.build.type]为 [userdebug]


apuser@billchenubt:~$ adb shell
# getprop
[persist.sys.usb.config]: [mass_storage,adb,vser,gser]
[ro.build.type]: [userdebug]

case18:提高service优先级的一种方式

默认启动的 Service 是被标记为 background,我们可以给 Service 设置 foreground 那么它优先级得到了一定的提高。当然这并不能保证你得 Service 永远不被杀掉,只是提高...

将服务写成前台服务foreground service

重写onStartCommand方法,使用StartForeground(int,Notification)方法来启动service。
注:前台服务会在状态栏显示一个通知,最典型的应用就是音乐播放器,只要在播放状态下,就算休眠也不会被杀,如果不想显示通知,只要把参数里的int设为0即可。
Java代码
Notification notification = new Notification(R.drawable.logo,
                "wf update service is running",
                System.currentTimeMillis());
        pintent = PendingIntent.getService(this, 0, intent, 0);
        notification.setLatestEventInfo(this, "WF Update Service",
                "wf update service is running!", pintent);
        //如果 id 为 0 ,那么状态栏的 notification 将不会显示。
        startForeground(startId, notification);
同时,对于通过startForeground启动的service,onDestory方法中需要通过stopForeground(true)来取消前台运行状态。

case19:在ActionBar中显示title,需要设置ActionBar中title显示属性,可以通过以下两种方式来实现

1.在配置文件中设置

每一个activity都可以设置其主题,在其中设置ActionBar的属性,添加以下属性,showTitle属性添加,就可以在ActionBar中显示当前activity的title。

showTitle

2.在代码中添加相关属性。

在代码中通过ActionBar中的setDisplayOptions方法,设置ActionBar.DISPLAY_SHOW_TITLE,这样就可以在ActionBar中显示title。

int options = showTitle ? ActionBar.DISPLAY_SHOW_TITLE : 0;
actionBar.setDisplayOptions(options,ActionBar.DISPLAY_SHOW_TITLE);

case20:android:configChanges中添加locale后,切换语言后Activity为何依旧重启?

AndroidManifest.xml中配置了configChanges locale属性

android:configChanges="locale" 

之后在不退出应用的情况下切换到Settings里切换语言,发现该Activity还是重启了。

原因是android4.2增加了一个layoutDirection属性,当改变语言设置后,该属性也会成newConfig中的一个mask位。所以ActivityManagerService(实际在ActivityStack)在决定是否重启Activity的时候总是判断为重启。

需要在android:configChanges 中同时添加locale和layoutDirection。

android:configChanges="locale|layoutDirection" 

切换语言后Activity就不会重启。


case21 如何让某个view悬浮在其他界面之上?

通过WindowManager提供的addView方法来实现,其添加的view在window的最前面,到达悬浮在其他Activity之上的目的。
1.获得WindowManager服务
WindowManager mWm = (WindowManager) mContext.getApplicationContext().getSystemService(
                Context.WINDOW_SERVICE);
2.设置LayoutParames参数                
WindowManager.LayoutParams mWmParams = new WindowManager.LayoutParams();
3.添加view mFloatLayout
mWm.addView(mFloatLayout, mWmParams);
4.此view移动位置,改变大小只需要修改mWmParams参数,然后updateViewLayout就可以了。
mWm.updateViewLayout(mFloatLayout, mWmParams);

case22:如何让自己的服务不处于后台运行

如何让自己的服务不处于后台运行中,因为在后台运行的服务优先级会降低,也就极有可能会被系统给回收掉,关于这个Google推荐我们将服务运行到前台
当栈顶中的Activity不是本应用的了,我们的服务也就相应的降低了优先级,也就说系统需要内存的时候,首先就会回收此服务消耗的内存。此时,我们只需将服务设置为前台运行即可:
1.设置为前台:第一个参数是通知ID,第二个参数是Notification对象
startForeground(SERVICE_NOTIFICATION, n);
2.停止前台服务可调用:true代表清除通知栏
stopForeground(true);









你可能感兴趣的:(移动,开发)