您的位置:

首页 >

5060官方网址大全 >

详解iOS App开发中session和coockie的用户数据存储处理 >

详解iOS App开发中session和coockie的用户数据存储处理

2016-11-04 07:39:58

分类:5060官方网址大全

NSURLSession在iOS7之后,NSURLSession作为系统推荐使用的HTTP请求框架,在进行前台请求的情况下,NSURLSession与NSURLConnection并无太大差异,对于后台的请求,NSURLSession更加灵活的优势就将展现无遗。1.NSURLSession集合的类型NSURLSession类提供3中Session类型:(1)Default类型:提供前台请求相关方法,支持配置缓存,身份凭证等。(2)Ephemeral类型:即时的请求类型,不使用缓存,身份凭证等。(3)Background:后台类型,支持在后台完成请求任务。2.NSURLSession任务的类型在NSURLSession中添加的请求任务支持3中类型:(1)数据任务:使用NSData对象进行数据的发送和获取,一般用于短数据的任务。(2)下载任务:从文件下载数据,支持后台下载。(3)上传任务:以文件的形式上传数据,支持后台上传。3.创建并配置NSURLSession:通过NSURLSessionConfiguration类对象对NSURLSession进行配置与创建,创建和配NSURLSession的示例代码如下:    //默认类型的    NSURLSessionConfiguration * defaultConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];    //即时类型的    NSURLSessionConfiguration * ephemeralConfiguration = [NSURLSessionConfiguration ephemeralSessionConfiguration];    //后台类型的    NSURLSessionConfiguration * backgroundConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"SessionId"];        //创建并设置session    NSURLSession * defaultSession = [NSURLSession sessionWithConfiguration:defaultConfiguration];    NSURLSession * ephemeralSession = [NSURLSession sessionWithConfiguration:ephemeralConfiguration];    NSURLSession * backgroundSession = [NSURLSession sessionWithConfiguration:backgroundConfiguration];NSURLSessionConfiguration还可以配置如缓存,网络模式等参数4.使用NSURLSession进行网络请求的两种方式NSURLSession有两种方式进行网络数据的请求,一种是通过block的方式获取网络数据,一种是通过代理回调的方式获取网络数据。通过block的方式进行请求代码如下:    //创建session配置对象    NSURLSessionConfiguration * defaultConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];    //创建请求对象    NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]];    //创建session对象    NSURLSession * defaultSession = [NSURLSession sessionWithConfiguration:defaultConfiguration];    //添加任务    NSURLSessionTask * task= [defaultSession dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {        NSLog(@"%@",data);    }];    //开始任务    [task resume];使用代理回调的方式进行请求需要遵守如下协议:@interface ViewController ()<NSURLSessionDataDelegate>@end将请求代码修改如下:    NSURLSessionConfiguration * defaultConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];    NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]];    NSURLSession * defaultSession = [NSURLSession sessionWithConfiguration:defaultConfiguration delegate:self delegateQueue:[NSOperationQueue mainQueue]];    NSURLSessionTask * task= [defaultSession dataTaskWithRequest:request];    [task resume];实现代理方法如下://开始接受数据-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{    NSLog(@"=======%@",data);}//接受数据结束-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{    NSLog(@"完成:error%@",error);}5.进行后台下载任务NSURLSession最大的优势在于其后台下载的灵活性,使用如下的代码进行后台数据下载: NSURLSessionConfiguration * backgroundConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.zyprosoft.backgroundsession"];    NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]];    NSURLSession *  backgroundSession   = [NSURLSession sessionWithConfiguration:backgroundConfiguration delegate:self delegateQueue:nil];    [[backgroundSession downloadTaskWithRequest:request]resume];在下面的回调方法中可以进行下载进度的监听:- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{    NSLog(@"######");}如果在下载过程中点击Home键使应用程序进入后台,NSURLSession的相关代理方法将不再被回调,但是下载任务依然在进行,当后台下载完成后会与AppDelegate进行交互,会调用AppDelegate中的如下方法:-(void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler{    NSLog(@"1111");}之后应用程序在后台会调用NSURLSesstion代理的如下方法来通知下载结果://此方法无论成功失败都会调用-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{    NSLog(@"完成:error%@",error);}//此方法只有下载成功才会调用 文件放在location位置-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{    }最后将调用NSURLSesstion的如下方法:-(void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session{        NSLog(@"All tasks are finished");    }CookieCookie是网站为了便是终端身份,保存在终端本地的用户凭证信息。Cookie中的字段与意义由服务端进行定义。例如,当用户在某个网站进行了登录操作后,服务端会将Cookie信息返回给终端,终端会将这些信息进行保存,在下一次再次访问这个网站时,终端会将保存的Cookie信息一并发送到服务端,服务端根据Cookie信息是否有效来判断此用户是否可以自动登录。iOS中进行Cookie管理的两个类:iOS中进行HTTP网络请求Cookie管理主要由两个类负责,一个类是NSHTTPCookieStorage类,一个是NSHTTPCookie类。1.NSHTTPCookieStorageNSHTTPCookieStorage类采用单例的设计模式,其中管理着所有HTTP请求的Cookie信息,常用方法如下://获取单例对象+ (NSHTTPCookieStorage *)sharedHTTPCookieStorage;//所有Cookie数据数组 其中存放NSHTTPCookie对象@property (nullable , readonly, copy) NSArray<NSHTTPCookie *> *cookies;//手动设置一条Cookie数据- (void)setCookie:(NSHTTPCookie *)cookie;//删除某条Cookie信息- (void)deleteCookie:(NSHTTPCookie *)cookie;//删除某个时间后的所有Cookie信息 iOS8后可用- (nullable NSArray<NSHTTPCookie *> *)cookiesForURL:(NSURL *)URL;//获取某个特定URL的所有Cookie数据- (void)removeCookiesSinceDate:(NSDate *)date NS_AVAILABLE(10_10, 8_0);//为某个特定的URL设置Cookie- (void)setCookies:(NSArray<NSHTTPCookie *> *)cookies forURL:(nullable NSURL *)URL mainDocumentURL:(nullable NSURL *)mainDocumentURL;//Cookie数据的接收协议/*枚举如下:typedef NS_ENUM(NSUInteger, NSHTTPCookieAcceptPolicy) {    NSHTTPCookieAcceptPolicyAlways,//接收所有Cookie信息    NSHTTPCookieAcceptPolicyNever,//不接收所有Cookie信息    NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain//只接收主文档域的Cookie信息};*/@property NSHTTPCookieAcceptPolicy cookieAcceptPolicy;系统下面的两个通知与Cookie管理有关://Cookie数据的接收协议改变时发送的通知FOUNDATION_EXPORT NSString * const NSHTTPCookieManagerAcceptPolicyChangedNotification;//管理的Cookie数据发生变化时发送的通知FOUNDATION_EXPORT NSString * const NSHTTPCookieManagerCookiesChangedNotification;2.NSHTTPCookieNSHTTPCookie是具体的HTTP请求Cookie数据对象,其中属性方法如下://下面两个方法用于对象的创建和初始化 都是通过字典进行键值设置- (nullable instancetype)initWithProperties:(NSDictionary<NSString *, id> *)properties;+ (nullable NSHTTPCookie *)cookieWithProperties:(NSDictionary<NSString *, id> *)properties;//返回Cookie数据中可用于添加HTTP头字段的字典+ (NSDictionary<NSString *, NSString *> *)requestHeaderFieldsWithCookies:(NSArray<NSHTTPCookie *> *)cookies;//从指定的响应头和URL地址中解析出Cookie数据+ (NSArray<NSHTTPCookie *> *)cookiesWithResponseHeaderFields:(NSDictionary<NSString *, NSString *> *)headerFields forURL:(NSURL *)URL;//Cookie数据中的属性字典@property (nullable, readonly, copy) NSDictionary<NSString *, id> *properties;//请求响应的版本@property (readonly) NSUInteger version;//请求相应的名称@property (readonly, copy) NSString *name;//请求相应的值@property (readonly, copy) NSString *value;//过期时间@property (nullable, readonly, copy) NSDate *expiresDate;//请求的域名@property (readonly, copy) NSString *domain;//请求的路径@property (readonly, copy) NSString *path;//是否是安全传输@property (readonly, getter=isSecure) BOOL secure;//是否只发送HTTP的服务@property (readonly, getter=isHTTPOnly) BOOL HTTPOnly;//响应的文档@property (nullable, readonly, copy) NSString *comment;//相应的文档[email protected] (nullable, readonly, copy) NSURL *commentURL;//服务端口列表@property (nullable, readonly,

本文写了一个常见的功能——手机app中注册或绑定手机号的获取验证码的功能,也就是短信验证功能  具体效果就是,你在注册界面填写手机号,点击获取验证码按钮,---然后会收到验证短信,填入验证码后点击注册按钮,如果验证正确就可以跳转到另外一个界面  1.首先大家需要在mob官网注册一个账号,mob是一个免费的短信验证平台  2.在mob.com后台创建应用  3.下载对应的sdk  4.将sdk作为一个library导入到你的项目中  5.现在就可以在你的项目中编写代码使用mob提供的这个功能了具体代码如下:首先配置文件加入权限:<uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 然后声明activity(这是固定的不能修改,直接复制粘贴到你的配置文件就行)<activity android:name="cn.smssdk.SMSSDKUIShell" android:configChanges="keyboardHidden|orientation|screenSize" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:windowSoftInputMode="stateHidden|adjustResize"/> 注册界面xml布局文件<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <EditText android:id="@+id/login_input_phone_et" android:layout_width="280dp" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="107dp" android:ems="10" android:hint="请输入手机号" android:inputType="phone" /> <requestFocus /> <EditText android:id="@+id/login_input_code_et" android:layout_width="170dp" android:layout_height="wrap_content" android:layout_alignLeft="@+id/login_input_phone_et" android:layout_below="@+id/login_input_phone_et" android:layout_marginTop="44dp" android:hint="请输入验证码" android:inputType="textPassword" > </EditText> <Button android:id="@+id/login_request_code_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignRight="@+id/login_input_phone_et" android:layout_alignTop="@+id/login_input_code_et" android:text="获取验证码" /> <Button android:id="@+id/login_commit_btn" android:layout_width="280dp" android:layout_height="wrap_content" android:layout_alignLeft="@+id/login_input_code_et" android:layout_below="@+id/login_input_code_et" android:layout_marginTop="44dp" android:text="注册" /> </RelativeLayout> 注册界面activitypackage com.mobdemo.view; import cn.smssdk.EventHandler; import cn.smssdk.SMSSDK; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.TextUtils; import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.ProgressBar; import android.widget.Toast; import android.widget.FrameLayout.LayoutParams; public class LoginActivity extends Activity implements OnClickListener { String APPKEY = "101732155b605"; String APPSECRETE = "69d1850f4b74100266ab576b64e6cb16"; // 手机号输入框 private EditText inputPhoneEt; // 验证码输入框 private EditText inputCodeEt; // 获取验证码按钮 private Button requestCodeBtn; // 注册按钮 private Button commitBtn; // int i = 30; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); init(); } /** * 初始化控件 */ private void init() { inputPhoneEt = (EditText) findViewById(R.id.login_input_phone_et); inputCodeEt = (EditText) findViewById(R.id.login_input_code_et); requestCodeBtn = (Button) findViewById(R.id.login_request_code_btn); commitBtn = (Button) findViewById(R.id.login_commit_btn); requestCodeBtn.setOnClickListener(this); commitBtn.setOnClickListener(this); // 启动短信验证sdk SMSSDK.initSDK(this, APPKEY, APPSECRETE); EventHandler eventHandler = new EventHandler(){ @Override public void afterEvent(int event, int result, Object data) { Message msg = new Message(); msg.arg1 = event; msg.arg2 = result; msg.obj = data; handler.sendMessage(msg); } }; //注册回调监听接口 SMSSDK.registerEventHandler(eventHandler); } @Override public void onClick(View v) { String phoneNums = inputPhoneEt.getText().toString(); switch (v.getId()) { case R.id.login_request_code_btn: // 1. 通过规则判断手机号 if (!judgePhoneNums(phoneNums)) { return; } // 2. 通过sdk发送短信验证 SMSSDK.getVerificationCode("86", phoneNums); // 3. 把按钮变成不可点击,并且显示倒计时(正在获取) requestCodeBtn.setClickable(false); requestCodeBtn.setText("重新发送(" + i + ")"); new Thread(new Runnable() { @Override public void run() { for (; i > 0; i--) { handler.sendEmptyMessage(-9); if (i <= 0) { break; } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } handler.sendEmptyMessage(-8); } }).start(); break; case R.id.login_commit_btn: //将收到的验证码和手机号提交再次核对 SMSSDK.submitVerificationCode("86", phoneNums, inputCodeEt .getText().toString()); //createProgressBar(); break; } } /** * */ Handler handler = new Handler() { public void handleMessage(Message msg) { if (msg.what == -9) { requestCodeBtn.setText("重新发送(" + i + ")"); } else if (msg.what == -8) { requestCodeBtn.setText("获取验证码"); requestCodeBtn.setClickable(true); i = 30; } else { int event = msg.arg1; int result = msg.arg2; Object data = msg.obj; Log.e("event", "event=" + event); if (result == SMSSDK.RESULT_COMPLETE) { // 短信注册成功后,返回MainActivity,然后提示 if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {// 提交验证码成功 Toast.makeText(getApplicationContext(), "提交验证码成功", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(LoginActivity.this, MainActivity.class); startActivity(intent); } else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) { Toast.makeText(getApplicationContext(), "正在获取验证码", Toast.LENGTH_SHORT).show(); } else { ((Throwable) data).printStackTrace(); } } } } }; /** * 判断手机号码是否合理 * * @param phoneNums */ private boolean judgePhoneNums(String phoneNums) { if (isMatchLength(phoneNums, 11) && isMobileNO(phoneNums)) { return true; } Toast.makeText(this, "手机号码输入有误!",Toast.LENGTH_SHORT).show(); return false; } /** * 判断一个字符串的位数 * @param str * @param length * @return */ public static boolean isMatchLength(String str, int length) { if (str.isEmpty()) { return false; } else { return str.length() == length ? true : false; } } /** * 验证手机格式 */ public static boolean isMobileNO(String mobileNums) { /* * 移动:134、135、136、137、138、139、150、151、157(TD)、158、159、187、188 * 联通:130、131、132、152、155、156、185、186 电信:133、153、180、189、(1349卫通) * 总结起来就是第一位必定为1,第二位必定为3或5或8,其他位置的可以为0-9 */ String telRegex = "[1][358]\\d{9}";// "[1]"代表第1位为数字1,"[358]"代表第二位可以为3、5、8中的一个,"\\d{9}"代表后面是可以是0~9的数字,有9位。 if (TextUtils.isEmpty(mobileNums)) return false; else return mobileNums.matches(telRegex); } /** * progressbar */ private void createProgressBar() { FrameLayout layout = (FrameLayout) findViewById(android.R.id.content); FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); layoutParams.gravity = Gravity.CENTER; ProgressBar mProBar = new ProgressBar(this); mProBar.setLayoutParams(layoutParams); mProBar.setVisibility(View.VISIBLE); layout.addView(mProBar); } @Override protected void onDestroy() { SMSSDK.unregisterAllEventHandler(); super.onDestroy(); } } 验证成功的界面我就不写了,希望大家通过这个实例可以学习掌握Android获取短信验证码的实现技巧。

一、下拉才出现的视图pull_to_refresh_header.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/pull_to_refresh_header" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#F3F3F3"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingTop="23dp"> <LinearLayout        android:id="@+id/pull_to_refresh_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_centerHorizontal="true"> <TextViewandroid:id="@+id/pull_to_refresh_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center"android:text="@string/pull_to_refresh_text" android:textColor="#777777" android:textSize="16sp"/> <TextViewandroid:id="@+id/pull_to_refresh_update_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center"android:text="@string/pull_to_refresh_update_text" android:textColor="#999999" android:textSize="14sp"/> </LinearLayout> <ProgressBarandroid:id="@+id/pull_to_refresh_progress" android:layout_width="30dp" android:layout_height="30dp"android:layout_toLeftOf="@id/pull_to_refresh_view" android:layout_marginRight="22dp" android:layout_marginTop="5dp" android:indeterminate="true"android:indeterminateDrawable="@drawable/ic_loading_refresh" android:visibility="gone"/> <ImageView android:id="@+id/pull_to_refresh_image" android:layout_width="32dp" android:layout_height="32dp"android:layout_toLeftOf="@id/pull_to_refresh_view" android:layout_marginRight="20dp" android:layout_marginTop="5dp" android:src="@drawable/ic_refresh_down" android:scaleType="centerInside"android:contentDescription="@string/app_name"/> </RelativeLayout> <View android:layout_width="match_parent" android:layout_height="15dp"/></LinearLayout>ic_loading_refresh.xml<?xml version="1.0" encoding="utf-8"?><rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/ic_loading" android:fromDegrees="0" android:toDegrees="360" android:pivotX="50%" android:pivotY="50%" />1、ProgressBar的indeterminate属性,代表进程的时间是否不确定。2、黄色底的是Android Studio的提示。第一个提示的是,当LinearLayout中的Text拓展得足够长时,会与ImageView重叠,实际效果是把ImageView给覆盖了。第二个是,建议用toStartOf代替toLeftOf,用marginEnd代替marginRight等。原因和影响还没完全搞懂。二、图标旋转的动画private ImageView mPull_to_refresh_image;private RotateAnimation mFlipAnimation;... mFlipAnimation = new RotateAnimation(0, -180, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f); mFlipAnimation.setInterpolator(new LinearInterpolator()); mFlipAnimation.setDuration(250); mFlipAnimation.setFillAfter(true);...mPull_to_refresh_image.startAnimation(mFlipAnimation);1、构造方法:public RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)(1)toDegrees - fromDegrees < 0 就会是逆时针旋转,反之是顺时针。这是我取不同值测试出来的。水平线右边是0°,或者360°,左边是180°,或者是-180°。(2)pivotType是枢轴类型,也就是旋转中心。RELATIVE_TO_SELF代表相对这个view本身。0.5f代表这个view一半大小的位置。2、setInterpolator作用是设置速度器。LinearInterpolator是匀速加速器,也就是匀速播放动画。3、setDuration作用是设置动画时长,以毫秒为单位。4、setFillAfter作用是,当参数为true时,动画播放完后,view会维持在最终的状态。而默认值是false,也就是动画播放完后,view会恢复原来的状态。以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

Android 网路判断判断当前网络是否是wifi/** * 判断当前是否是wifi * @param mContext * @return */ private static boolean isWifi(Context mContext) { ConnectivityManager connectivityManager = (ConnectivityManager) mContext .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); if (activeNetInfo != null && activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) { return true; } return false; } }一、判断网络连接是否可用public static boolean isNetworkAvailable(Context context) { ConnectivityManager cm = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); if (cm == null) { } else {       //如果仅仅是用来判断网络连接       //则可以使用 cm.getActiveNetworkInfo().isAvailable(); NetworkInfo[] info = cm.getAllNetworkInfo(); if (info != null) { for (int i = 0; i < info.length; i++) { if (info[i].getState() == NetworkInfo.State.CONNECTED) { return true; } } } } return false; }   二、判断GPS是否打开 public static boolean isGpsEnabled(Context context) { LocationManager lm = ((LocationManager) context .getSystemService(Context.LOCATION_SERVICE)); List<String> accessibleProviders = lm.getProviders(true); return accessibleProviders != null && accessibleProviders.size() > 0; }  三、判断WIFI是否打开public static boolean isWifiEnabled(Context context) { ConnectivityManager mgrConn = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); TelephonyManager mgrTel = (TelephonyManager) context .getSystemService(Context.TELEPHONY_SERVICE); return ((mgrConn.getActiveNetworkInfo() != null && mgrConn .getActiveNetworkInfo().getState() == NetworkInfo.State.CONNECTED) || mgrTel .getNetworkType() == TelephonyManager.NETWORK_TYPE_UMTS); } 四、判断是否是3G网络 public static boolean is3rd(Context context) { ConnectivityManager cm = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkINfo = cm.getActiveNetworkInfo(); if (networkINfo != null && networkINfo.getType() == ConnectivityManager.TYPE_MOBILE) { return true; } return false; } 五、判断是wifi还是3g网络,用户的体现性在这里了,wifi就可以建议下载或者在线播放。public static boolean isWifi(Context context) { ConnectivityManager cm = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkINfo = cm.getActiveNetworkInfo(); if (networkINfo != null && networkINfo.getType() == ConnectivityManager.TYPE_WIFI) { return true; } return false; }感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

前言:我们在Android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“Go”按键加载url页面;在点击搜索框的时候,点击右下角的search符号键可以进行搜索;或者在全部数据输入完毕后,点击右下角的"done"就马上进行下一步操作。效果图:function 1:重写Activity的dispatchKeyEvent(KeyEvent event)方法,在其中监听KeyEventKey.KEYCODE_ENTER键(右下角确定键),当此键按下的时候,隐藏输入法软键盘,设置edittext内容和加载webview内容。@Override public boolean dispatchKeyEvent(KeyEvent event) { if(event.getKeyCode() == KeyEvent.KEYCODE_ENTER){ /*隐藏软键盘*/ InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if(inputMethodManager.isActive()){ inputMethodManager.hideSoftInputFromWindow(MainActivity.this.getCurrentFocus().getWindowToken(), 0); } edittext.setText("success"); webview.loadUrl(URL); return true; } return super.dispatchKeyEvent(event); } function 2:重写dispatchKeyEvent(KeyEvent event)的方法感觉有点用牛刀的感觉,因为我们非常可能在这个方法中进行其他任务,所以我们可以使用OnKeyListener的方法来监听软键盘按键。private OnKeyListener onKeyListener = new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN){ /*隐藏软键盘*/ InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if(inputMethodManager.isActive()){ inputMethodManager.hideSoftInputFromWindow(v.getApplicationWindowToken(), 0); } edittext.setText("success"); webview.loadUrl(URL); return true; } return false; } }; edittext.setOnKeyListener(onKeyListener); function 3:第三种方法我认为可以帮助程序员更精确的判断右下角按键情况,以便应对更加复杂的情况。它可以帮助程序员依据当前邮件下为“GO”,“done”,“search”键的情况下做出更细分的操作。edittext.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { /*判断是否是“GO”键*/ if(actionId == EditorInfo.IME_ACTION_GO){ /*隐藏软键盘*/ InputMethodManager imm = (InputMethodManager) v .getContext().getSystemService( Context.INPUT_METHOD_SERVICE); if (imm.isActive()) { imm.hideSoftInputFromWindow( v.getApplicationWindowToken(), 0); } edittext.setText("success"); webview.loadUrl(URL); return true; } return false; } }); 改变软键盘右下角确定键样式:软键盘输入法的按键并不是一成不变的,例如它的右下角的“确定”键,在有搜索框的时候就会变成带搜索图标的按键,在浏览器地址栏的时候则会变成“GO”键,我们在写App的时候也可能根据情况的不同设置输入法的“确定”键,改变方法就是给EditText控件的imeOptions属性设置成不同的值(此时Enter键可以显示不同的文字和图案)。<EditText android:id="@+id/edittext" android:layout_width="match_parent" android:layout_height="wrap_content" android:singleLine="true" android:imeOptions="actionSearch"/> actionNone : 回车键,按下后光标到下一行 actionGo : Go, actionSearch : 放大镜 actionSend : Send actionNext : Next actionDone : Done,确定/完成,隐藏软键盘,即使不是最后一个文本输入框 题外话:我在写这个demo的时候,发现了webview的一个问题,就是直接使用webview.load(url)方法会在手机上面弹出系统浏览器来访问url链接,而不是我们设置的webview,我找到的解决办法就是使用webview.setWebViewClient(....)的方法来确保url会在activity的webview上面加载。demo下载地址:android-softkeyboard_jb51.rar以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

焦点访谈

最新最热的文章

更多 >

COPYRIGHT (©) 2017 Copyright ©2017 5060网址大全 网站地图

联系我们

827570882

扫描二维码分享到微信