PreferenceActivity用法简介(二)

article/2025/10/29 22:48:59

本测试主要是为了测试PreferenceActivity的使用,其中设置了播放背景音乐和开启wifi的设置,也就是本文要讲的

PreferenceActivity。

Android提供了放摆放的工具来定义所有的程序的首选项,并支持既不不许要编写代码的情况写显示这些首选项。可以在一个名为res/xml/settings.xml的资源文件中定义这些首选项:

res/xml/settings.xml

 

Java代码 复制代码  收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>   
  2. <PreferenceScreen   
  3.   xmlns:android="http://schemas.android.com/apk/res/android">   
  4.     <CheckBoxPreference   
  5.         android:key="music"  
  6.         android:title="@string/music"  
  7.         android:summaryOn="@string/music_summaryOn"  
  8.         android:summaryOff="@string/music_summaryOff"  
  9.         android:defaultValue="true"    
  10.     />   
  11.     <CheckBoxPreference   
  12.         android:key="wifi"  
  13.         android:title="@string/wifi"  
  14.         android:summaryOn="@string/wifi_summaryOn"  
  15.         android:summaryOff="@string/wifi_summaryOff"  
  16.         android:defaultValue="true"    
  17.     />   
  18. </PreferenceScreen>  
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference
android:key="music"
android:title="@string/music"
android:summaryOn="@string/music_summaryOn"
android:summaryOff="@string/music_summaryOff"
android:defaultValue="true" 
/>
<CheckBoxPreference
android:key="wifi"
android:title="@string/wifi"
android:summaryOn="@string/wifi_summaryOn"
android:summaryOff="@string/wifi_summaryOff"
android:defaultValue="true" 
/>
</PreferenceScreen>

 res/values/strings.xml

Xml代码 复制代码  收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <string name="hello">Hello World, NewGameActivity!</string>  
  4.     <string name="btntext">开始游戏</string>  
  5.     <string name="app_name">NewGame</string>  
  6.     <string name="game_level">游戏级别</string>  
  7.     <string name="easy_level">菜鸟级</string>  
  8.     <string name="general_level">普通级</string>  
  9.     <string name="medium_level">高手级</string>  
  10.     <string name="hard_level">骨灰级</string>  
  11.     <string name="wifiinfo">启动wifi</string>  
  12.      <string name="music">音乐</string>  
  13.     <string name="music_summaryOn">开启背景音乐</string>  
  14.      <string name="music_summaryOff">关闭背景音乐</string>  
  15.     <string name="wifi">无线</string>  
  16.     <string name="wifi_summaryOn">开启无线网络</string>  
  17.     <string name="wifi_summaryOff">关闭无线网络</string>  
  18. </resources>  

Settings.java

Java代码 复制代码  收藏代码
  1. package com.hualang.gotogame;   
  2.   
  3. import android.content.Context;   
  4. import android.os.Bundle;   
  5. import android.preference.PreferenceActivity;   
  6. import android.preference.PreferenceManager;   
  7.   
  8. public class Settings extends PreferenceActivity {   
  9.     private static final String MUSIC = "music";   
  10.     private static final boolean MUSIC_DEF = true;   
  11.     private static final String WIFI = "wifi";   
  12.     private static final boolean WIFI_DEF = true;   
  13.     @Override  
  14.     public void onCreate(Bundle savedInstanceState) {   
  15.         super.onCreate(savedInstanceState);   
  16.         addPreferencesFromResource(R.xml.settings);   
  17.     }   
  18.     //获得当前音乐的值   
  19.     public static boolean getMusic(Context context)   
  20.     {   
  21.         return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(MUSIC, MUSIC_DEF);   
  22.     }   
  23.     //获取当前蓝牙选项的值   
  24.     public static boolean getWifi(Context context)   
  25.     {   
  26.         return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(WIFI, WIFI_DEF);   
  27.     }   
  28.        
  29.        
  30. }  
package com.hualang.gotogame;
import android.content.Context;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
public class Settings extends PreferenceActivity {
private static final String MUSIC = "music";
private static final boolean MUSIC_DEF = true;
private static final String WIFI = "wifi";
private static final boolean WIFI_DEF = true;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
}
//获得当前音乐的值
public static boolean getMusic(Context context)
{
return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(MUSIC, MUSIC_DEF);
}
//获取当前蓝牙选项的值
public static boolean getWifi(Context context)
{
return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(WIFI, WIFI_DEF);
}
}

 addPreferencesFromResource()方法从XML中读取设置定义,并将其解压缩到当前的活动试图中,所有耗时的解压缩工作都是在PreferenceActivity类中处理的

保存的Preference文件存放在data/data/项目包名/shared_prefs下,名字为“包名_preferences.xml”

这里的就是:

com.hualang.gotogame_preferences.xml
Music.java 用于设置背景音乐

Java代码 复制代码  收藏代码
  1. package com.hualang.gotogame;   
  2.   
  3. import android.content.Context;   
  4. import android.media.MediaPlayer;   
  5.   
  6. public class Music {   
  7.     private static MediaPlayer mp = null;   
  8.     //停止旧歌曲,开始新歌曲   
  9.     public static void play(Context context, int resource)   
  10.     {   
  11.         stop(context);   
  12.         if(Settings.getMusic(context))   
  13.         {   
  14.             mp = MediaPlayer.create(context, resource);   
  15.             mp.setLooping(true);   
  16.             mp.start();   
  17.         }   
  18.     }   
  19.     //停止音乐   
  20.     public static void stop(Context context)   
  21.     {   
  22.         if(mp!=null)   
  23.         {   
  24.             mp.stop();   
  25.             mp.release();   
  26.             mp = null;   
  27.         }   
  28.     }   
  29. }  
package com.hualang.gotogame;
import android.content.Context;
import android.media.MediaPlayer;
public class Music {
private static MediaPlayer mp = null;
//停止旧歌曲,开始新歌曲
public static void play(Context context, int resource)
{
stop(context);
if(Settings.getMusic(context))
{
mp = MediaPlayer.create(context, resource);
mp.setLooping(true);
mp.start();
}
}
//停止音乐
public static void stop(Context context)
{
if(mp!=null)
{
mp.stop();
mp.release();
mp = null;
}
}
}

 下面就是核心代码了,这里主要说一下如何调用背景音乐和蓝牙

背景音乐:

首先,开发者必须了解Android的生命周期,当我们运行的时候,会经历onCreate---onStart---onResume,我们可以将设置背景音乐和蓝牙的设置放在此处,代码如下:

Java代码 复制代码  收藏代码
  1. @Override  
  2. protected void onResume() {   
  3.     // TODO Auto-generated method stub   
  4.     super.onResume();   
  5.     Music.play(this, R.raw.test);   
  6.     if(Settings.getWifi(this))   
  7.     {   
  8.         wifion();   
  9.     }else  
  10.     {   
  11.         wifioff();   
  12.     }   
  13.     Log.d("System.out""onResume-----------");   
  14. }  
	@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Music.play(this, R.raw.test);
if(Settings.getWifi(this))
{
wifion();
}else
{
wifioff();
}
Log.d("System.out", "onResume-----------");
}

 这样,如果保存的CheckBoxPreferences为true,就设置背景音乐,启动wifi,否则就关闭北京音乐,关闭wifi

当我们进入设置界面的时候,进入了onPause,设置完后返回主界面,又变成了onResume,所以背景音乐部分在进入

onPause时停止掉,只有到进入主界面玩游戏的时候再开启,这样要合理些。代码如下:

Java代码 复制代码  收藏代码
  1. @Override  
  2. protected void onPause() {   
  3.     // TODO Auto-generated method stub   
  4.     super.onPause();   
  5.     Music.stop(this);   
  6.     Log.d("System.out""onPause----------------");   
  7. }  
	@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
Music.stop(this);
Log.d("System.out", "onPause----------------");
}

 

Wifi:

首先需要在清单文件中加入权限:

Xml代码 复制代码  收藏代码
  1. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>  
  2.    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>  
  3.    <uses-permission android:name="android.permission.WAKE_LOCK"/>  

 我们也将wifi的操作放在onResume中

Java代码 复制代码  收藏代码
  1. public void wifion()   
  2. {   
  3.     if(!wifiManager.isWifiEnabled())   
  4.         wifiManager.setWifiEnabled(true);   
  5. }   
  6. public void wifioff()   
  7. {   
  8.     if(wifiManager.isWifiEnabled())   
  9.         wifiManager.setWifiEnabled(false);   
  10. }  
	public void wifion()
{
if(!wifiManager.isWifiEnabled())
wifiManager.setWifiEnabled(true);
}
public void wifioff()
{
if(wifiManager.isWifiEnabled())
wifiManager.setWifiEnabled(false);
}

 上面两个方法用户打开和关闭wifi。

下面的代码通过判断Setting.getWifi(this)的布尔值,如果真,也就是被选中的话,则打卡wifi,否则关闭wifi

Java代码 复制代码  收藏代码
  1. @Override  
  2. protected void onResume() {   
  3.     // TODO Auto-generated method stub   
  4.     super.onResume();   
  5.     Music.play(this, R.raw.test);   
  6.     if(Settings.getWifi(this))   
  7.     {   
  8.         wifion();   
  9.     }else  
  10.     {   
  11.         wifioff();   
  12.     }   
  13.     Log.d("System.out""onResume-----------");   
  14. }  
	@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Music.play(this, R.raw.test);
if(Settings.getWifi(this))
{
wifion();
}else
{
wifioff();
}
Log.d("System.out", "onResume-----------");
}
 

 NewGameActivity

 
Java代码 复制代码  收藏代码
  1. package com.hualang.gotogame;   
  2.   
  3. import android.app.Activity;   
  4. import android.app.AlertDialog;   
  5. import android.content.Context;   
  6. import android.content.DialogInterface;   
  7. import android.content.Intent;   
  8. import android.content.SharedPreferences;   
  9. import android.net.wifi.WifiManager;   
  10. import android.os.Bundle;   
  11. import android.util.Log;   
  12. import android.view.Menu;   
  13. import android.view.MenuItem;   
  14. import android.view.View;   
  15. import android.view.View.OnClickListener;   
  16. import android.widget.Button;   
  17.   
  18. public class NewGameActivity extends Activity {   
  19.     private Button clickme;   
  20.     WifiManager wifiManager;   
  21.     @Override  
  22.     public void onCreate(Bundle savedInstanceState) {   
  23.         super.onCreate(savedInstanceState);   
  24.         setContentView(R.layout.main);   
  25.         wifiManager = (WifiManager)this.getSystemService(Context.WIFI_SERVICE);   
  26.         clickme = (Button)findViewById(R.id.clickme);   
  27.         clickme.setOnClickListener(new OnClickListener()   
  28.         {   
  29.   
  30.             @Override  
  31.             public void onClick(View v) {   
  32.                 startNewGameDialog();   
  33.             }   
  34.                
  35.         });   
  36.           
  37.     }   
  38.        
  39.     private void startNewGameDialog()   
  40.     {   
  41.         new AlertDialog.Builder(this)   
  42.         .setTitle(R.string.game_level)   
  43.         .setItems(R.array.difficulty,    
  44.                 new DialogInterface.OnClickListener() {   
  45.                        
  46.                     @Override  
  47.                     public void onClick(DialogInterface dialog, int which) {   
  48.                         startGame(which);   
  49.                     }   
  50.                 }).show();   
  51.     }   
  52.        
  53.     private void startGame(int i)   
  54.     {   
  55.         //开始游戏   
  56.     }   
  57.   
  58.     @Override  
  59.     public boolean onCreateOptionsMenu(Menu menu) {   
  60.         menu.add(0,0,0,"设置");   
  61.         menu.add(0,1,1,"关于");   
  62.         menu.add(0,2,2,"退出");   
  63.         return super.onCreateOptionsMenu(menu);   
  64.            
  65.     }   
  66.   
  67.     @Override  
  68.     public boolean onOptionsItemSelected(MenuItem item) {   
  69.         switch(item.getItemId())   
  70.         {   
  71.         case 0:   
  72.         {   
  73.             Intent intent = new Intent();   
  74.             intent.setClass(NewGameActivity.this, Settings.class);   
  75.             startActivity(intent);   
  76.         }   
  77.         break;   
  78.         case 1:   
  79.             break;   
  80.         case 2:   
  81.             finish();   
  82.             break;   
  83.         }   
  84.         return super.onOptionsItemSelected(item);   
  85.     }   
  86.        
  87.     @Override  
  88.     protected void onResume() {   
  89.         // TODO Auto-generated method stub  
  90.         super.onResume();   
  91.         Music.play(this, R.raw.test);   
  92.         if(Settings.getWifi(this))   
  93.         {   
  94.             wifion();   
  95.         }else  
  96.         {   
  97.             wifioff();   
  98.         }   
  99.         Log.d("System.out""onResume-----------");   
  100.     }   
  101.   
  102.     @Override  
  103.     protected void onPause() {   
  104.         // TODO Auto-generated method stub  
  105.         super.onPause();   
  106.         Music.stop(this);   
  107.         Log.d("System.out""onPause----------------");   
  108.     }   
  109.        
  110.     public void wifion()   
  111.     {   
  112.         if(!wifiManager.isWifiEnabled())   
  113.             wifiManager.setWifiEnabled(true);   
  114.     }   
  115.     public void wifioff()   
  116.     {   
  117.         if(wifiManager.isWifiEnabled())   
  118.             wifiManager.setWifiEnabled(false);   
  119.     }   
  120.        
  121.        
  122. }  
package com.hualang.gotogame;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class NewGameActivity extends Activity {
private Button clickme;
WifiManager wifiManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
wifiManager = (WifiManager)this.getSystemService(Context.WIFI_SERVICE);
clickme = (Button)findViewById(R.id.clickme);
clickme.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v) {
startNewGameDialog();
}
});
}
private void startNewGameDialog()
{
new AlertDialog.Builder(this)
.setTitle(R.string.game_level)
.setItems(R.array.difficulty, 
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startGame(which);
}
}).show();
}
private void startGame(int i)
{
//开始游戏
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0,0,0,"设置");
menu.add(0,1,1,"关于");
menu.add(0,2,2,"退出");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId())
{
case 0:
{
Intent intent = new Intent();
intent.setClass(NewGameActivity.this, Settings.class);
startActivity(intent);
}
break;
case 1:
break;
case 2:
finish();
break;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Music.play(this, R.raw.test);
if(Settings.getWifi(this))
{
wifion();
}else
{
wifioff();
}
Log.d("System.out", "onResume-----------");
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
Music.stop(this);
Log.d("System.out", "onPause----------------");
}
public void wifion()
{
if(!wifiManager.isWifiEnabled())
wifiManager.setWifiEnabled(true);
}
public void wifioff()
{
if(wifiManager.isWifiEnabled())
wifiManager.setWifiEnabled(false);
}
}

 

运行结果如下:



 

 

 

源代码见附件:


http://chatgpt.dhexx.cn/article/hoB55iU8.shtml

相关文章

Android之PreferenceActivity

看到很多书中都没有对PreferenceActivity做介绍&#xff0c;而我在看Android Samples时无意中看见了&#xff0c;所以就稍微总结一下&#xff0c;也方便日后查找。 PerferenceActivity是什么&#xff0c;看下面的截图&#xff1a; 好了&#xff0c;我们看到Android系统本身就大…

Android PreferenceActivity使用

PreferenceActivity继承了ListActivity&#xff0c;定义Activity继承PreferenceActivity。在res目录下新建一个xml文件夹&#xff0c;接着在这个文件夹下新建一个取名为preferences.xml的File文件&#xff0c;xml中可以使用的标签(Tag)可以分为两类&#xff0c;一类是管理布局的…

PreferenceActivity定制

android很多设置界面都会使用PreferenceActivity来实现&#xff0c;但那个界面比较丑陋&#xff0c;显示开发总是满足不了要求。 可以自己实现一个&#xff0c;但是那样又会使Activity中的逻辑代码和xml布局文件过于复杂&#xff0c;远远不及PreferenceActivity来的方便快捷。…

PreferenceActivity、PreferenceFragment使用

目录 目录前言PreferenceActivity preferences_scenario_1xmlPreference Activity演示 PreferenceFragment xml布局文件Preference FragmentPreference Activity管理Fragment 适配 前言 转来转去又回到了Android&#xff0c;闲话少说&#xff0c;这里是参考Android原生的Setti…

Android PreferenceActivity的介绍

转载&#xff1a;http://blog.chinaunix.net/uid-24666775-id-351136.html 在Android中的APIdemos是中经常遇到过继承于PreferenceActivity这个类&#xff0c;紧接着就是addPreferencesFromResource(R.xml.*******);&#xff08;附&#xff1a;这个******就是一个XML文件&#…

Android开发--详解SharedPreference/PreferenceActivity

我们经常看到应用程序的设置页面&#xff0c;一般用到设置页面时&#xff0c;我们会继承自PreferenceActivity&#xff0c;它实现了SharedPreference&#xff0c;并生成相应的XML文件自动保存用户的设置&#xff0c;在设置页面中&#xff0c;每一个列表项都是一个Preference&am…

Android之PreferenceActivity 详解

看到很多书中都没有对PreferenceActivity做介绍&#xff0c;而我正好又在项目中用到&#xff0c;所以就把自己的使用的在这总结一下&#xff0c;也方便日后查找。 PerferenceActivity是什么&#xff0c;看下面的截图&#xff1a; Android系统截图&#xff08;左&#xff09; …

android的PreferenceActivity

前言 这段时间在研究android平台上的开源项目——StandupTimer&#xff0c;这是由jwood所设计的一个较为简单android应用&#xff0c;用于控制会议时间&#xff0c;类似秒表倒计时。 PreferenceActivity PreferenceActivity是android提供的对系统信息和配置进行自动保存的Activ…

用StopWatch统计耗时,比System.currentTimeMillis好用

平时项目中统计耗时都用System.currentTimeMillis&#xff0c;最近看到一个spring-StopWatch统计耗时&#xff0c;其用法简单明了&#xff0c;比传统统计耗时方法好用。 StopWatch 的内部是通过 System.nanoTime() 来计时的&#xff0c;本质和 System.currentTimeMillis() 差别…

并发慎用——System.currentTimeMillis()

好记忆不如烂笔头&#xff0c;能记下点东西&#xff0c;就记下点&#xff0c;有时间拿出来看看&#xff0c;也会发觉不一样的感受. System.currentTimeMillis()是极其常用的基础Java API&#xff0c;广泛地用来获取时间戳或测量代码执行时长等&#xff0c;在我们的印象中应该快…

System.currentTimeMillis()的性能问题以及解决方法

System.currentTimeMillis()是极其常用的基础Java API&#xff0c;广泛地用来获取时间戳或测量代码执行时长等&#xff0c;在我们的印象中应该快如闪电。但实际上在并发调用或者特别频繁调用它的情况下&#xff08;比如一个业务繁忙的接口&#xff0c;或者吞吐量大的需要取得时…

统计代码执行时间时,System.currentTimeMillis()与System.nanoTime()哪个更适合?

目录 1.nanoTime是什么&#xff1f; 2.currentTimeMillis是什么&#xff1f; 3.nanoTime与currentTimeMillis在JDK中阐述 4.nanoTime与currentTimeMillis使用对比 5.深究从OpenJDK源代码、glibc&#xff0c;一直到Linux内核 6.总结 1.nanoTime是什么&#xff1f; ns&…

System.currentTimeMillis的性能如何

一、背景 撸代码时发现System.currentTimeMillis的调用都被封装成了cache类型&#xff0c;代码如下: 那么System.currentTimeMillis真的有这么这么差吗&#xff0c;如果差的话又是什么原因造成的&#xff1f;什么情况下可以直接调用原生方法&#xff0c;什么情况下需要使用缓存…

别再用 System.currentTimeMillis 统计耗时了,太 Low,试试 Spring Boot 源码在用的 StopWatch吧,够优雅

大家好&#xff0c;我是二哥呀&#xff01; 昨天&#xff0c;一位球友问我能不能给他解释一下 SpringBootApplication 注解是什么意思&#xff0c;还有 Spring Boot 的运行原理&#xff0c;于是我就带着他扒拉了一下这个注解的源码&#xff0c;还有 SpringApplication 类的 ru…

System.currentTimeMillis的性能,真有如此不堪吗?

# 疑惑&#xff0c;System.currentTimeMillis真有性能问题&#xff1f; 最近我在研究一款中间件的源代码时&#xff0c;发现它获取当前时间不是通过System.currentTimeMillis&#xff0c;而是通过自定义的System.currentTimeMillis的缓存类&#xff08;见下方&#xff09;&…

疑惑,System.currentTimeMillis真有性能问题?

点击关注公众号&#xff0c;Java干货及时送达 System.currentTimeMillis的性能真有如此不堪吗&#xff1f; 最近我在研究一款中间件的源代码时&#xff0c;发现它获取当前时间不是通过System.currentTimeMillis&#xff0c;而是通过自定义的System.currentTimeMillis的缓存类&a…

高并发下System.currentTimeMillis()性能问题及优化方案

文章目录 背景System.currentTimeMillis()性能测试单线程测试多线程测试 原因优化优化代码单线程测试多线程测试 参考 背景 最近在看asyncTool源码发现了System.currentTimeMillis存在卡顿问题&#xff0c;所以就详细研究了下。具体如何呢&#xff1f;我们来看看 System.curr…

currentTimeMillis()方法

currentTimeMillis()方法返回一个long类型的值&#xff0c;该值表示的是当前时间与1970年1月1日0时0分0秒之间的时间差&#xff0c;单位是毫秒&#xff0c;习惯上被称为时间戳 源码&#xff1a; 时间戳可以用来计算循环操作时所需要的时间&#xff1a; /*** 向goods表中插入…

Java获取当前时区时间LocalDateTime与System.currentTimeMillis

Java获取当前时区时间 System.currentTimeMillisLocalDateTime最终结果 全球根据纬度不同&#xff0c;划分不同的时区。对于此时此刻&#xff0c;大家同处同一个时间点&#xff0c;但是&#xff0c;每个时区的时间表示是不同的。Java可以使用 System.currentTimeMillis和 Loc…

关于Java currentTimeMillis方法简述

刚刚接触JAVA时&#xff0c;为了便于记录某个方法块的执行时间&#xff0c;通常都会在代码块的执行前和执行后各标记一个时间&#xff0c;取两个时间差。 但是初学者一般只会选择用LocalDateTime来标记&#xff0c;然后用Duration.between来做差值。当然&#xff0c;Duration可…