zoukankan      html  css  js  c++  java
  • openfire+asmack搭建的安卓即时通讯(六) 15.4.16

    啊啊啊啊啊啊啊啊,这东西越做越觉得是个深坑啊!

    1.SharedPreferences.Editor的密码保存和自动登录:

    首先还是从主界面开始,因为要提升一下用户体验自然要加入保存密码和自动登录的功能。

     1         <CheckBox
     2             android:text="保存密码"
     3             android:layout_weight="1"
     4             android:id="@+id/save_password"
     5             android:layout_width="wrap_content"
     6             android:layout_height="wrap_content" />
     7         <CheckBox
     8             android:text="自动登录"
     9             android:layout_weight="1"
    10             android:id="@+id/auto_login_in"
    11             android:layout_width="wrap_content"
    12             android:layout_height="wrap_content" />

    接着在主活动里写一下下:

    1        check_watch=(CheckBox)findViewById(R.id.show);
    2         check_watch.setOnCheckedChangeListener(checkBox_Listener);
    3 
    4         check_save=(CheckBox)findViewById(R.id.save_password);
    5         check_save.setOnCheckedChangeListener(checkBox_Listener);
    6 
    7         check_auto=(CheckBox)findViewById(R.id.auto_login_in);
    8         check_auto.setOnCheckedChangeListener(checkBox_Listener);
    1 private SharedPreferences sp;
    2 public static SharedPreferences.Editor editor;
    1 sp = this.getSharedPreferences("userInfo",Context.MODE_PRIVATE);//存储密码
     1 private OnCheckedChangeListener checkBox_Listener = new OnCheckedChangeListener() {//所有checkbox的监听器
     2         @Override
     3         public void onCheckedChanged(CompoundButton buttonView,
     4                                      boolean isChecked) {
     5             // TODO Auto-generated method stub
     6                 switch (buttonView.getId())
     7                 {
     8                     case R.id.show:
     9                         if (isChecked) {
    10                             password.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
    11                         } else {
    12                             password.setTransformationMethod(PasswordTransformationMethod.getInstance());
    13                         }
    14                         break;
    15                     case R.id.save_password:
    16                         if (isChecked) {
    17                             sp.edit().putBoolean("ISCHECK", true).apply();
    18                         } else {
    19                             sp.edit().putBoolean("ISCHECK", false).apply();
    20                         }
    21                         break;
    22                     case R.id.auto_login_in:
    23                         if (isChecked) {
    24                             sp.edit().putBoolean("AUTO_ISCHECK", true).apply();
    25                         } else {
    26                             sp.edit().putBoolean("AUTO_ISCHECK", false).apply();
    27                         }
    28                         break;
    29                 }
    30         }
    31     };
    32     private void checkbox_init() {//checkbox判断函数
    33         //判断记住密码多选框的状态
    34         if(sp.getBoolean("ISCHECK", false))
    35         {
    36             //设置默认是记录密码状态
    37             check_save.setChecked(true);
    38             name.setText(sp.getString("USER_NAME",""));
    39             password.setText(sp.getString("PASSWORD",""));
    40             //判断自动登陆多选框状态
    41             if(sp.getBoolean("AUTO_ISCHECK", false))
    42             {
    43                 //设置默认是自动登录状态
    44                 check_auto.setChecked(true);
    45                 //跳转界面
    46                 //account=sp.getString("USER_NAME","");
    47                 //pwd=sp.getString("PASSWORD","");
    48                 Log.i("======================"+account,pwd+"===================================");
    49                 accountLogin();
    50             }
    51         }
    52     }
    53     private void setCheck_save(){
    54         if(check_save.isChecked())
    55         {
    56             //记住用户名、密码、
    57             editor = sp.edit();
    58             editor.putString("USER_NAME", account);
    59             editor.putString("PASSWORD",pwd);
    60             editor.apply();
    61         }
    62     }

    在onCreat()里面每次都要判check_init()断一下密码的存储状态,然后再在每次登陆成功后运行setCheck_save()来保存密码。OnCheckChangeListener()里面设置checkbox的按下和弹起的状态。

    2.用户的注册、利用webview进行访问作者博客:

    在下面加入了两个新的Button的用来注册和访问作者博客。

    1)webview的使用:

    加入了一个放一个webview的活动:

     1 package com.lfk.webim;
     2 
     3 import android.os.Bundle;
     4 import android.view.KeyEvent;
     5 import android.view.View;
     6 import android.webkit.WebSettings;
     7 import android.webkit.WebView;
     8 import android.webkit.WebViewClient;
     9 import android.widget.ZoomButtonsController;
    10 
    11 import com.lfk.webim.appli.BaseActivity;
    12 
    13 import java.lang.reflect.Field;
    14 
    15 
    16 public class AuthorBlog extends BaseActivity {
    17     private WebView webView;
    18     @Override
    19     protected void onCreate(Bundle savedInstanceState) {
    20         super.onCreate(savedInstanceState);
    21         setContentView(R.layout.activity_author_blog);
    22         webView=(WebView)findViewById(R.id.webview);
    23         webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);  //使滚动条不占位
    24         WebSettings webSettings =webView.getSettings();
    25         webSettings.setBuiltInZoomControls(true);
    26         webView.setInitialScale(100);//缩放比例(完全不缩放)
    27         webView.getSettings().setDisplayZoomControls(false);//隐藏webview缩放按钮
    28         setZoomControlGone(webView);
    29         webView.getSettings().setJavaScriptEnabled(true);//允许使用JS
    30         webView.setWebViewClient(new WebViewClient() {//设置url
    31             @Override
    32             public boolean shouldOverrideUrlLoading(WebView view, String url) {
    33                 view.loadUrl(url);
    34                 return true;
    35             }
    36         });
    37        webView.loadUrl("http://www.cnblogs.com/lfk-dsk/");
    38 
    39     }
    40     public void setZoomControlGone(View view) {
    41         Class classType;
    42         Field field;
    43         try {
    44             classType = WebView.class;
    45             field = classType.getDeclaredField("mZoomButtonsController");
    46             field.setAccessible(true);
    47             ZoomButtonsController mZoomButtonsController = new ZoomButtonsController(view);
    48             mZoomButtonsController.getZoomControls().setVisibility(View.GONE);
    49             try {
    50                 field.set(view, mZoomButtonsController);
    51             } catch (IllegalArgumentException e) {
    52                 e.printStackTrace();
    53             } catch (IllegalAccessException e) {
    54                 e.printStackTrace();
    55             }
    56         } catch (SecurityException e) {
    57             e.printStackTrace();
    58         } catch (NoSuchFieldException e) {
    59             e.printStackTrace();
    60         }
    61     }
    62     @Override
    63     public boolean onKeyDown(int keyCode, KeyEvent event) {//设置返回键,返回键不直接回都上一个活动,而是放回webview的上一页
    64         if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
    65             webView.goBack();// 返回前一个页面
    66             return true;
    67         }
    68         return super.onKeyDown(keyCode, event);
    69     }
    70 }

    2)注册的方法实现:

     1 public static String regist(String account, String password) {
     2         if (connect.getConnection() == null)
     3             return "0";
     4         Registration reg = new Registration();
     5         reg.setType(IQ.Type.SET);
     6         reg.setTo(connect.getConnection().getServiceName());
     7         reg.setUsername(account);// 注意这里createAccount注册时,参数是username,不是jid,是“@”前面的部分。
     8         reg.setPassword(password);
     9         reg.addAttribute("android", "geolo_createUser_android");// 这边addAttribute不能为空,否则出错。所以做个标志是android手机创建的吧!!!!!
    10         PacketFilter filter = new AndFilter(new PacketIDFilter(
    11                 reg.getPacketID()), new PacketTypeFilter(IQ.class));
    12         PacketCollector collector = connect.getConnection()
    13                 .createPacketCollector(filter);
    14         connect.getConnection().sendPacket(reg);
    15         IQ result = (IQ) collector.nextResult(SmackConfiguration
    16                 .getPacketReplyTimeout());
    17         // Stop queuing results
    18         collector.cancel();// 停止请求results(是否成功的结果)
    19         if (result == null) {
    20             Log.e("RegistActivity", "No response from server.");
    21             return "no find on internet";
    22         } else if (result.getType() == IQ.Type.RESULT) {
    23             return "regist success";
    24         } else { // if (result.getType() == IQ.Type.ERROR)
    25             if (result.getError().toString().equalsIgnoreCase("conflict(409)")) {
    26                 Log.e("RegistActivity", "IQ.Type.ERROR: "
    27                         + result.getError().toString());
    28                 return "this account has existed";
    29             } else {
    30                 Log.e("RegistActivity", "IQ.Type.ERROR: "
    31                         + result.getError().toString());
    32                 return "regist failed";
    33             }
    34         }
    35     }

    最好把这个函数加入工具类,接着写一个和主界面差不多的界面用来注册:

     1 package com.lfk.webim;
     2 
     3 import android.app.Activity;
     4 import android.os.Bundle;
     5 import android.os.Message;
     6 import android.text.method.HideReturnsTransformationMethod;
     7 import android.text.method.PasswordTransformationMethod;
     8 import android.util.Log;
     9 import android.view.View;
    10 import android.widget.CheckBox;
    11 import android.widget.CompoundButton;
    12 import android.widget.EditText;
    13 import android.widget.Toast;
    14 
    15 import com.lfk.webim.server.ConnecMethod;
    16 import com.lfk.webim.server.connect;
    17 
    18 
    19 public class regist extends Activity implements View.OnClickListener {
    20     private EditText name,password;
    21     private String nametemp,pwdtemp;
    22     static int MSTTL=1;
    23     static int MSTTLS=0;
    24     @Override
    25     protected void onCreate(Bundle savedInstanceState) {
    26         super.onCreate(savedInstanceState);
    27         setContentView(R.layout.activity_regist);
    28         name=(EditText)findViewById(R.id.login_name_reg);
    29         password=(EditText)findViewById(R.id.login_password_reg);
    30         findViewById(R.id.buttonclear_reg).setOnClickListener(this);
    31         findViewById(R.id.button_regist_reg).setOnClickListener(this);
    32         CheckBox checkBox1=(CheckBox)findViewById(R.id.show_reg);
    33         connect.getConnection();
    34         checkBox1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    35             @Override
    36             public void onCheckedChanged(CompoundButton buttonView,
    37                                          boolean isChecked) {
    38                 // TODO Auto-generated method stub
    39                 if (isChecked) {
    40                     password.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
    41                 } else {
    42                     password.setTransformationMethod(PasswordTransformationMethod.getInstance());
    43                 }
    44             }
    45         });
    46     }
    47     private android.os.Handler RegHandler = new android.os.Handler() {
    48         public void handleMessage(android.os.Message msg) {
    49             switch (msg.what) {
    50                 case 1:
    51                     name.setText("");
    52                     password.setText("");
    53                     Log.d("+++++","=======================");
    54                     break;
    55                 case 0:
    56                     String temp= String.valueOf(msg.obj);
    57                     Toast.makeText(regist.this,temp,Toast.LENGTH_SHORT).show();
    58                 default:
    59                     break;
    60             }
    61         }
    62     };
    63 
    64     private void accountRegis() {
    65         new Thread() {
    66             public void run() {
    67                 String account = ((EditText) findViewById(R.id.login_name_reg))
    68                         .getText().toString();
    69                 String pwd = ((EditText) findViewById(R.id.login_password_reg)).getText()
    70                         .toString();
    71                 String is = ConnecMethod.regist(account, pwd);
    72                 Message message=new Message();
    73                 message.what=MSTTLS;
    74                 message.obj=is;
    75                 RegHandler.sendMessage(message);
    76             }
    77         }.start();
    78     }
    79     @Override
    80     public void onClick(View v) {
    81         // TODO Auto-generated method stub
    82         switch (v.getId()) {
    83             case R.id.buttonclear_reg:
    84                 Message message=new Message();
    85                 message.what=MSTTL;
    86                 RegHandler.sendMessage(message);
    87                 break;
    88             case R.id.button_regist_reg:
    89                 Log.d("======================", "Reg");
    90                 accountRegis();
    91                 break;
    92             default:
    93                 break;
    94         }
    95     }
    96 
    97 }

    另外加入了一个Clear的Button用来清理所有的东西让用户重新入。

    3.好友界面的修改:

    find方法还没有弄完,所以先说之前的。

    加入了谷歌的下拉刷新来及时的更新数据:

     1     <android.support.v4.widget.SwipeRefreshLayout
     2         xmlns:android="http://schemas.android.com/apk/res/android"
     3         android:id="@+id/swipe_refresh"
     4         android:layout_below="@id/find_fri"
     5         android:layout_width="match_parent"
     6         android:layout_height="match_parent">
     7         <ListView
     8             android:id="@+id/friend_list"
     9             android:layout_width="match_parent"
    10             android:layout_height="match_parent">
    11         </ListView>
    12     </android.support.v4.widget.SwipeRefreshLayout>
     1        swipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
     2 
     3             @Override
     4             public void onRefresh() {
     5                 new Handler().postDelayed(new Runnable() {//延迟跳转=-=
     6                     public void run() {
     7                         swipeLayout.setRefreshing(true);
     8                         mArrayAdapter.clear();
     9                         ClientConServer.getFriends();
    10                         swipeLayout.setRefreshing(false);
    11                     }
    12                 }, 500);
    13 
    14             }
    15         });

    在每次refresh的时候就重新获取一下好友数据。

    4.添加服务防止后台清理:

    一个聊天软件只要后台就要重新启动,不觉得很坑嘛?我们就在friend活动添加一个服务开启,即使我们按了HOME键,也不会退出也可以重新进入,而且最好在friend活动添加,这样我们成功的登陆了这样也方便。

     1 public class Myserver extends Service {
     2     @Override
     3     public IBinder onBind(Intent intent) {
     4         return null;
     5     }
     6 
     7     @Override
     8     public void onCreate(){
     9         super.onCreate();
    10         Notification notification=new Notification(R.mipmap.ic_launcher,"Just We running",System.currentTimeMillis());
    11         Intent intent=new Intent(this, friend.class);
    12         PendingIntent pendingIntent=PendingIntent.getActivity(this,0,intent,0);
    13         notification.setLatestEventInfo(this,"Just We","Online",pendingIntent);
    14         Log.d("Myservice       ","         Oncreater");
    15         startForeground(1, notification);
    16     }
    17 
    18 }
    1         Intent intentServer= new Intent(this, Myserver.class);
    2         startService(intentServer);

    然后在活动里intent一下一边开启一个带通知的前台服务。而且你还可以通过这个前台的通知随时进入friend活动界面。

    5.注销帐号:

    我们能登陆就要能注销,这样才便于我们使用:

    我把一个注销帐号的方法写进meau里面了。

            <item
                android:id="@+id/action_settings_base"
                android:title="@string/action_stop"
                android:showAsAction="never"
                tools:ignore="AppCompatResource" />

    我写了一个BaseActivity然后添加了这个meau让后让应该继承的来继承:

    1                 MainActivity.check_save.setChecked(false);
    2                 MainActivity.check_auto.setChecked(false);
    3                 MainActivity.editor.putString("USER_NAME", "");
    4                 MainActivity.editor.putString("PASSWORD", "");
    5                 Intent intent = new Intent(this, MainActivity.class);
    6                 startActivity(intent);
    7                 Intent stopintent = new Intent(this, Myserver.class);
    8                 stopService(stopintent);
    9                 user.UserName="";user.FromName_="";user.FromName="";user.UserName="";

    清空checkbox,清空密码,关闭服务,跳转页面清空全局变量的存储。

    6.对发送进行限制:

    1         if(content.equals("")) {
    2             android.os.Message mm = new android.os.Message();
    3             mm.what=1;
    4             mhandle.handleMessage(mm);
    5         }
    1  case 1:
    2                         Toast.makeText(useractivity.this, "不能发送空消息", Toast.LENGTH_SHORT).show();
    3                         break;

    功能是越来越丰富了呢!今天就改到这样好了,求赞=-=

  • 相关阅读:
    PHP如何让apache支持.htaccess 解决Internal Server Error The server …错误
    PHP文件的上传下载
    Centos rsync文件同步配置
    Nginx负载均衡策略
    MongoDB 基本命令
    nginx keepalived 主从切换
    iptabels 的一些配置
    负载均衡 LVS+Keepalived
    FreeBSD 系统的配置.
    linux下利用curl监控web应用状态
  • 原文地址:https://www.cnblogs.com/lfk-dsk/p/4433319.html
Copyright © 2011-2022 走看看