`
yunlonglove
  • 浏览: 238964 次
社区版块
存档分类
最新评论

利用Shared Preferences实现用户本地登录

 
阅读更多

Android中四种数据存储方式, Shared Preferences主要是以键值对的形式来存储数据,他仅仅是轻量级存储机制,主要实现android比较简单参数的设置。这里主要利用其中一种即Shared Preferenced来实现本地用户登录,下面是效果图:

这时我们可以设置用户名和密码。

然后,当我们下次在打开软件的时候,即出现下面登录的效果:

点击确定之后我们就可以进入下一层显示。Shared Preference主要是以getPreference()方法获取对象,然后再通过Editor来设置里面键值对形式的参数,最后再通过commit方法来提交保存这些数据,这些数据无法共享,即无法直接在多个程序间共享Preference数据。下面是上面效果的主要源码:

public class MainActivity extends Activity {

    private	AlertDialog setPrefernAlertDialog;
    private AlertDialog showPasswordDialog;
    private  boolean isFirst;
    //保存数据 专用
    private SharedPreferences sp;
    private EditText safenumber;
    private TelephonyManager tm;
    private Button  start_button,modify_button;
    private boolean isStart;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sp=this.getSharedPreferences("data",MODE_WORLD_READABLE);  
        //主要以键值对的形式取出
       isFirst=sp.getBoolean("first", true);
       //若值没设置 则开始设置密码一类
       if (isFirst)
  	{
  		showSetPasswordDialog();
  		return;
  	}else {
  		
  		showInputPasswordDialog();
  	  }
       
    }
    public void init()
    {
    	setContentView(R.layout.activity_main);	
    	
    }

      //第一次使用 创建弹出输入密码对话框 属于dialog的基本操作 
      private void showSetPasswordDialog()
      {
      	AlertDialog.Builder builder=new AlertDialog.Builder(this);
          //给Dialog设置View 从XML文件转换而来 这是属于基本操作
      	 LayoutInflater inflater=LayoutInflater.from(this); 
          View view=	inflater.inflate(R.layout.show_password_dialog,null);
          final EditText	username =(EditText)view.findViewById(R.id.username);
          final EditText  userpassword=(EditText)view.findViewById(R.id.password);
          
          
          Button ok=(Button)view.findViewById(R.id.ok);
          Button cancle=(Button)view.findViewById(R.id.cancle);
          //设置动作
          ok.setOnClickListener(new OnClickListener()
  		{
  			
  			@Override
  			public void onClick(View v)
  			{
  				// TODO Auto-generated method stub
  				String name=username.getText().toString();
  				String password=userpassword.getText().toString();
  				//设置密码时 判断两者不能为空
  				if(name.trim().equals("") || password.trim().equals("")) {
  					Toast.makeText(MainActivity.this, "用户名和密码不能为空", Toast.LENGTH_LONG).show();
  					 return;
  				}
  				//sharedpreferences的基本操作 以键值对的形式保存到data文件中
  			    Editor editor=sp.edit();
  			    editor.putString("name",name);
  			    editor.putString("password",password);
  				editor.putBoolean("first", false);
  				//提交保存到生成的XML文件中
  				editor.commit();
  				setPrefernAlertDialog.dismiss();
  				init();
  				
  			}
  		});
          cancle.setOnClickListener(new OnClickListener()
  		{
  			
  			@Override
  			public void onClick(View v)
  			{
  				// TODO Auto-generated method stub
  				//这里注意要消去 对话框 再finish掉Activity 否则 有bug
  				if (isFirst)
  				{
  					setPrefernAlertDialog.dismiss();
  					MainActivity.this.finish();
  				}
  				setPrefernAlertDialog.dismiss();
  				
  			}
  		});
          
          
      	builder.setTitle("请设置密码");
      	builder.setView(view);
          setPrefernAlertDialog=builder.create();
          setPrefernAlertDialog.show();
     
      }
      /*
       * 当不是第一次操作,即已经设置完密码之后的操作
       */
         
      public void   showInputPasswordDialog()
      {
    	   AlertDialog.Builder builder = new AlertDialog.Builder(this);
    		
    		LayoutInflater inflater = LayoutInflater.from(this);
    		View view = inflater.inflate(R.layout.show_password_dialog, null);
    		final EditText et_username = (EditText) view.findViewById(R.id.username);
    		final EditText et_password = (EditText) view.findViewById(R.id.password);
    		
    		Button btn_ok = (Button) view.findViewById(R.id.ok);
    		Button btn_cancle = (Button) view.findViewById(R.id.cancle);
    		
    		btn_ok.setOnClickListener(new OnClickListener() {

    			public void onClick(View v) {
    				String name = et_username.getText().toString();
    				String password = et_password.getText().toString();
    				
    				if(name.trim().equals("") || password.trim().equals("")) {
    					Toast.makeText(MainActivity.this, "用户名和密码不能为空", Toast.LENGTH_LONG).show();
    					return;
    				}
    				//获取保存文件中的用户名和密码 
    				String savedUsername = sp.getString("name", "");
    				String savedPassword = sp.getString("password", "");
    				//查看输入的密码和名字是否一致 
    				if(name.trim().equals(savedUsername) && password.trim().equals(savedPassword)) {
    					init();
    					showPasswordDialog.dismiss();
    				} else {
    					Toast.makeText(MainActivity.this, "用户名或者密码错误", Toast.LENGTH_LONG).show();
    					return;
    				}
    				
    			}});
    		//下面属于基本的操作 
    		btn_cancle.setOnClickListener(new OnClickListener() {

    			public void onClick(View v) {
    				showPasswordDialog.dismiss();
    				MainActivity.this.finish();
    				
    			}});
    		
    		builder.setTitle("输入密码");
    		builder.setView(view);
    		showPasswordDialog = builder.create();
    		showPasswordDialog.show();

      }

}


上面最基本的一些含义已经注释了,记住一点就是这点:

//这里注意要先消去对话框 再finish掉Activity 否则 有bug

if (isFirst)

{ setPrefernAlertDialog.dismiss();

MainActivity.this.finish(); }

下面是show_password_dialog.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <EditText 
     android:id="@+id/username"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"   
     android:hint="请输入用户名 :"   
        />
    <EditText 
     android:id="@+id/password"   
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:password="true"   
     android:hint="请输入用户密码:"   
        />
<LinearLayout 
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    >
    <Button 
    android:id="@+id/ok"    
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/ok" 
    android:layout_weight="1"
    android:textSize="20sp"
    android:textColor="@color/purple"
        />
        <Button 
    android:id="@+id/cancle"    
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/cancle" 
    android:layout_weight="1"
    android:textSize="20sp"  
    android:textColor="@color/purple"
 />
</LinearLayout>
</LinearLayout>

分享到:
评论

相关推荐

    android 数据存储之 Shared Preferences

    在Android应用开发中,数据存储是一项...在实际开发中,根据需求选择合适的存储方式,合理利用`SharedPreferences`,可以有效地管理应用的配置和用户偏好。同时,了解其内部机制有助于我们编写更加高效和可靠的代码。

    35 Flutter仿京东商城项目 用户注册 完成注册、保存用户信息、跳转到根、显示用户信息.rar

    在这个项目中,可能选择将用户的登录信息(如ID和token)存储在Shared Preferences中,以便之后的登录操作。 页面间的跳转是Flutter中的另一关键概念。Flutter使用Navigator组件管理应用程序的路由栈。当用户成功...

    Android 本地保存数据

    Android提供了多种本地数据存储机制,包括Shared Preferences、内部存储、外部存储、SQLite数据库以及最近引入的Room Persistence Library。在“Android 本地保存数据”这个主题中,我们将主要关注Shared ...

    base64 sharedpreference保存图像

    通过学习这个示例,开发者可以了解如何在不使用数据库或文件系统的情况下,利用Shared Preferences存储和恢复复杂数据,这对于小规模的数据管理非常有用。但是,需要注意的是,Base64编码会使数据体积增大约33%,...

    FirestoreLogin_SharedPreference

    在`FirestoreLogin_SharedPreference`项目中,很可能是在实现用户登录功能时,利用Firebase Firestore存储用户信息,同时利用Shared Preferences保存登录状态。例如,当用户成功登录后,将用户ID或其他标识信息存储...

    Android应用源码之获取网络数据到本地并查看-IT计算机-毕业设计.zip

    9. **数据安全**: 如果存储敏感信息,如用户登录凭证,应考虑加密。Android提供了一些安全库,如Android Keystore System,用于安全地存储密钥。 10. **响应式编程**: 使用`RxJava`或`Kotlin Coroutines`可以实现...

    Android应用源码之获取网络数据到本地并查看.zip

    6. **数据缓存**:为了提高性能和用户体验,源码可能会实现网络数据的本地缓存策略,如HTTP响应头的`Cache-Control`或`ETag`字段的利用。 7. **UI更新**:获取数据后,需要更新用户界面。可能使用`RecyclerView`...

    MicroBlog微博

    利用SQLite数据库或者Android的Shared Preferences,可以存储用户的微博信息、好友列表等,使得用户在无网络连接时仍能浏览部分内容。此外,使用异步加载技术,如AsyncTask或Retrofit+OkHttp,可以在后台加载数据,...

    AppService.rar

    可以使用SQLite数据库或Shared Preferences来存储本地数据。 接下来,"左屏实现"与"侧滑屏实现"是负一屏实现的两个侧面: - **左屏实现**:这个描述可能是指将负一屏设置为主屏幕的左侧。在Android中,开发者可以...

    AndroidAPI之数据储存[定义].pdf

    1. **Shared Preferences**:这是一种用于存储轻量级、私有数据的机制,通常用于保存用户的设置或者简单偏好。Shared Preferences是以键值对的形式存储数据,支持boolean, float, int, long, 和 String类型。例如,...

    Android- stetho-master.rar

    Stetho是Facebook开源的一个强大的Android设备调试工具集,它使得开发者可以通过Chrome浏览器来直接查看和操作Android应用的数据,包括SQLite数据库、网络请求、Shared Preferences等,极大地简化了Android应用的...

    Flutter空壳模版工程,已实现国际化、主题换肤、登录注册等功能flutter-template-master.zip

    为了安全存储用户信息,项目可能使用了`shared_preferences`库进行本地数据存储,或者集成第三方登录服务如Google、Facebook等。 4. **文件结构与组织(Project Structure)** Flutter项目通常遵循特定的文件结构...

    基于android平台的天气预报软件设计学士学位论文.doc

    此外,为了节省存储空间,论文中提到了两种数据存储方法:使用Files保存天气信息,以及用Shared Preferences存储用户偏好设置。这两种方式都是Android提供的轻量级本地数据存储方案,它们既能满足数据持久化的需求,...

    校园订餐系统

    例如,当用户首次加载店铺或菜品列表时,可以将数据存储在本地(如SQLite数据库或Shared Preferences),之后在无网络或网络不稳定的情况下,应用可以从本地读取数据,减少网络延迟带来的等待时间。 此外,考虑到...

    绝对给力的源码,在线音乐播放器完整项目.zip

    4. **数据存储**:可能需要保存用户的播放历史、收藏列表等信息,可以使用SQLite数据库或Shared Preferences来实现本地数据存储。 5. **后台服务**:为了实现后台播放,开发者需要了解Service的概念,创建一个音乐...

    毕业论文安卓214城市天气服务(app).doc

    7. **详细设计**:这部分描述了具体界面设计、数据处理逻辑和交互流程,以实现用户友好且高效的界面。 8. **测试**:包括功能测试、性能测试和用户体验测试,确保应用的稳定性和准确性。 9. **系统截图**:展示...

    带有历史记录的计算器

    - 如果历史记录需要在应用程序关闭后仍然保留,那么就需要将数据存储到本地,如SQLite数据库或Shared Preferences。 - 当用户下次打开应用时,可以从存储中读取历史记录并加载到内存中。 5. **性能优化**: - 为...

    android天气预报应用

    另一种选择是使用Shared Preferences存储少量非结构化数据。 通知和定位服务也是天气应用的常见特性。利用Android的Location API,可以获取用户的地理位置,以便提供所在城市的天气信息。同时,可以通过...

    Android源码——北京公交线路查询(离线).7z

    Android提供了多种本地数据存储方式,如SQLite数据库、Shared Preferences、内部存储和外部存储等。在这个项目中,可能使用SQLite来存储大量的公交线路数据,因为SQLite适合管理结构化的大量数据。 2. 数据解析:...

Global site tag (gtag.js) - Google Analytics