Android(安卓)Activity
一.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设置成对话框样式
更多相关文章
- android通过chmod命令实现文件权限修改
- Android下PreferenceScreen 加载流程
- Android原生方法和Web JS互相调用-两种写法
- Android方法数超出限定的问题(multiDex,jumboMode)
- 浅谈Java中Collections.sort对List排序的两种方法
- 箭头函数的基础使用
- NPM 和webpack 的基础使用
- Python list sort方法的具体使用
- 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程