一.AndroidManifest中控制Activity中行为

1.强制执行单任务模式:

确保设备上只有一个activity实例在运行,需要在activity元素中包含MAIN和LAUNCHER两个intent过滤器:

android:launchMode="singleInstance"

2.将所有的activity作为同一个任务,共享信息方便:

android:launchMode="singleTask"

3.无论用户通过什么方式进入activity都能保存任务的状态:(确保用户总是能够返回到关闭之前的状态)

android:alwaysRetainTaskState="true"

4.activity强制设置纵向模式:

android:screenOrientation="portrait"

5.activity强制设置横向模式:

android:screenOrientation="landscape"

6.防止硬键盘滑出:

android:configChanges="orientation|keyboardHidden" 可以和screenOrientation一起使用


二.this引用在onClick方法中不能正确解析,在匿名内部类中提供当前上下文环境的方法:

使用Context.this代替this

使用getApplicationContext()来代替this

显示的使用类名

声明方法


三.将语音转换成文本并启动activity显示结果:

onClick方法中:

Intentintent=newIntent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);intent.putExtra(RecognizerIntent.EXTRA_PROMPT,"Sayawordorphrase\nanditwillshowastext");startActivityForResult(intent,RECOGNIZER_EXAMPLE);onActivityResult():if(requestCode==RECOGNIZER_EXAMPLE&&resultCode==RESULT_OK){ArrayList<String>result=data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);}


四.Activity跳转获取回传值(列举Activity和Dialog)

在Activity调用另一Activity时,通常使用如下方法获得返回值:

IntentsampleIntent=newIntent(ThisActivity.this,NewActivity.class);startActivityForResult(sampleIntent,1);

但如果调用的是Dialog类,或其他非Activity类时,无法使用startActivityForResult()方法。

此时,需使用另一种方法获得返回值。方法如下:

假设:主Activity为MainActivity;被调用的Dialog类为SampleDialog

1.我们需定义一个接口类:

interfaceMyListener{publicvoidrefreshActivity(Stringtext);}

2.在SampleDIalog的构造函数中传入MyListener:

publicMyListener(MyListenermyListener){this.mMyListener=myListener;}

3.在需要返回的地方调用refreshActivity()方法:

mMyListener.refreshActivity();

4.在MainActivity中实现MyListener接口,并在show Dialog时传入实现的myListener:

privateMyListenermyListener=newMyListener(){@OverridepublicvoidrefreshActivity(Stringtext){this.mTextView1.setText(text);}};newSampleDialog(myListener).show;

这样便能从Dialog返回需要的数据。


五.Activity跳转时值传递

根据个人经验大概总结三种方式:(由A向B传递参数)

1.intent传递消息

A中添加数据:

Intentintent=newIntent(A.this,B.class);intent.putExtra("activityMain","数据来自A");//A中把数据添加进去startActivity();//startActivityForResult(intent1,REQUEST_CODE);

B中接收数据

Bundleextras=getIntent().getExtras();if(extras!=null)StringMUSIC_PATH=extras.getString("activityMain");

在基类的Activity中封装方法:

<>(Stringkey){Intentintent=.getIntent()Objectobj=intent.getExtras().get(key)(obj==){}()obj}(Stringkey){.getIntent().hasExtra(key)}

2.使用广播方式,server传递消息这个方式也与intent有关

优点:可以后台运行,直到真正退出应用程序

发送端:

ActivityReceiveractivityreceiver=newActivityReceiver();//创建广播接收派生类IIntentFilterfilter=newIntentFilter();//创建IntentFilter消息过滤器filter.addAction("jjplayer.update");//添加消息行为registerReceiver(activityreceiver,filter);//注册监听Intentintent=newIntent(this,MyService.class);startService(intent);

其中ActivityReceiver 是自己创建的接收广播类,参考代码如下:

publicclassActivityReceiverextendsBroadcastReceiver{//自定义的广播接收者@OverridepublicvoidonReceive(Contextcontext,Intentintent){methodstubintupdate=intent.getIntExtra("update",-1);//得到Intent中的数据switch(update){case1://没有声音播放,设置当前状态status=1;break;case2://开始播放,设置当前图片为播放状态//start.setImageResource(R.drawable.temp);btStart.setImageResource(R.drawable.pause);status=2;break;case3://暂停当中,设置图片和状态btStart.setImageResource(R.drawable.play);status=3;break;}}}

发送端注册之后,就可以根据不同的响应机制发送消息了,比如监听按键来发送消息,参考代码如下:

publicvoidonClick(Viewv){//来自单击鼠标接口onclickListenner的方法Intentintent=newIntent("yxj.play.control");//创建intent,滤波器内容为//包yxj.play中的control类switch(v.getId()){caseR.id.btStart://开始播放按钮intent.putExtra("ACTION",1);//存放数据sendBroadcast(intent);//发送数据break;caseR.id.btStop:intent.putExtra("ACTION",2);sendBroadcast(intent);break;}}

接收端:

接收端注册信息

ServiceReceiverserviceRt=newServiceReceiver();//创建广播类BroadcastReceiverIntentFilterintentfilter=newIntentFilter();//创建过滤器intentfilter.addAction("yxj.play.control");registerReceiver(serviceRt,intentfilter);//注册其中ServiceReceiver是接收server消息的处理类,参考代码如下publicclassServiceReceiverextendsBroadcastReceiver{Uriuri=Uri.parse("file:///sdcard/breathhard.mp3");@OverridepublicvoidonReceive(Contextcontext,Intentintent){intaction=intent.getIntExtra("ACTION",-1);//获取actionswitch(action){//根据action做出响应case1:if(status==1){mp=MediaPlayer.create(context,uri);status=2;IntentsendIntent=newIntent("yxj.play.update");sendIntent.putExtra("update",2);//准备发送小消息的内容sendBroadcast(sendIntent);//广播方式发送消息mp.start();}

server注册:

这种方式的server需要在Androidmanifest.xml文件下面注册,在</application>之前添加

<serviceandroid:name=".MyService"android:process=":remote"></service>

3.使用SharedPreferrences存储类

在类A中设置:

SharedPreferencesparam=getSharedPreferences("JJParam",MODE_PRIVATE);SharedPreferences.Editoreditor=param.edit();editor.putString("MUSIC_PATH",currentDirectory.toString());editor.commit();

在类B中接收

SharedPreferencesparam=getSharedPreferences("JJParam",MODE_PRIVATE);if(param!=null){//如果文件已经存在,则继续if(param.getString("MUSIC_PATH",null)!=null)//获取文件路径Music_Path=param.getString("MUSIC_PATH",null);

这种用法比较简单,生成的JJParam.xml文件系统自动存储到了/data/data/PACKAGE_NAME/shared_prefs目录下

/data/data/PACKAGE_NAME /shared_prefs 目录下。


Uri分成三部份:访问资源的命名机制;存放资源的主机名;资源自身的名称,由路径表示。

比如“Http://www.baidu.com/text/xxx.html”

这里面Http是命名机制(协议名),

www.baidu.com是资源位置,text/xxxlhtml是资源名称。

在Android系统中如“content://contacts/1”表示,

在系统中contacts(联系人)中的第1号,就很容易定位到一个资源了,

采用了这些共用的格式后,就可以与系统中的其他处理程序来进行无缝交互,比如

Intentintent=newIntent(Intent.ACTION_DIAL,Uri.parse(“tel:555-2368”));startActivity(intent);

就可以用来启动一个拨号程序。

定义好了参数格式,我们在启用界面里就可以用

Uridata=Uri.parse("xxxx");intent.setData(data);//传递参数

在子界面中,我们用

Intentintent=getIntent();Uridata=intent.getData();

来接收传来的参数

在子界面中,关闭界面时,也有确定和取消之分,

我们在点击确定按钮时可以这样处理:

Uridata=Uri.parse("Content://"+edit.getText());Intentresult=newIntent(null,data);setResult(RESULT_OK,result);//传确定信息,和参数finish();

当点击取消按钮时,这样处理:

setResult(RESULT_CANCELED,null);//传取消信息,和参数finish();

在父界面中,我们通过一个

public void onActivityResult(int requestCode, int resultCode, Intent data)

继承函数来处理所有子界面的返回消息。这里面传来了请求代码,返回代码,和返回值,比如:

publicvoidonActivityResult(intrequestCode,intresultCode,Intentdata){super.onActivityResult(requestCode,resultCode,data);if(resultCode==Activity.RESULT_OK){Urihorse=data.getData();TextViewtxt=(TextView)findViewById(R.id.TextView01);txt.setText(horse.toString());}}


六.沉浸式状态栏的效果

首先要注意的是,这种沉浸式状态栏的效果4.4系统及以上才会支持

方法很简单,在你们代码setContentView之前中加入版本判断:

if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT){//透明状态栏getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//透明导航栏一些手机如果有虚拟键盘的话,虚拟键盘就会变成透明的,挡住底部按钮点击事件所以,最好不要用//getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);}

在对应的xml中想让状态栏和哪个View的背景颜色融合,就在哪个View中加入下面两行属性就行了

比如我想让状态栏和某一个ImageView的颜色融合

android:fitsSystemWindows="true"android:clipToPadding="true"
<ImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="centerCrop"android:fitsSystemWindows="true"android:clipToPadding="true"android:src="@drawable/bg_lesson_normal"/>

七.将Activity设置成对话框样式

Android 将activity设置成对话框样式


更多相关文章

  1. android通过chmod命令实现文件权限修改
  2. Android下PreferenceScreen 加载流程
  3. Android原生方法和Web JS互相调用-两种写法
  4. Android方法数超出限定的问题(multiDex,jumboMode)
  5. 浅谈Java中Collections.sort对List排序的两种方法
  6. 箭头函数的基础使用
  7. NPM 和webpack 的基础使用
  8. Python list sort方法的具体使用
  9. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程

随机推荐

  1. android中自定义checkbox大小和图片
  2. android多线程开发
  3. Android(安卓)ProgressBar 各种样式大全
  4. 功能强大的android相机框架
  5. Android数据存储总结 之二
  6. Android之数据统计
  7. Android面试题集
  8. 聊聊android界面适配
  9. 开发商为什么仍然忽视Android系统?
  10. Android(安卓)判断应用前后台运行状态并