您的位置:

首页 >

软件编程 >

Android 判断是否有外网连接 >

Android 判断是否有外网连接

2016-02-01 10:07:04

分类:软件编程

Android里判断是否可以上网,常用的是如下方法:/** * 检测网络是否连接 * * @return */private boolean isNetworkAvailable() { // 得到网络连接信息 ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); // 去进行判断网络是否连接 if (manager.getActiveNetworkInfo() != null) { return manager.getActiveNetworkInfo().isAvailable(); } return false;}有时候我们连接上一个没有外网连接的WiFi或者有线就会出现这种极端的情况,目前Android SDK还不能识别这种情况,一般的解决办法就是ping一个外网。/* @author suncat * @category 判断是否有外网连接(普通方法不能判断外网的网络是否连接,比如连接上局域网) * @return */ public static final boolean ping() { String result = null; try { String ip = "www.baidu.com";// ping 的地址,可以换成任何一种可靠的外网 Process p = Runtime.getRuntime().exec("ping -c 3 -w 100 " + ip);// ping网址3次 // 读取ping的内容,可以不加 InputStream input = p.getInputStream(); BufferedReader in = new BufferedReader(new InputStreamReader(input)); StringBuffer stringBuffer = new StringBuffer(); String content = ""; while ((content = in.readLine()) != null) { stringBuffer.append(content); } Log.d("------ping-----", "result content : " + stringBuffer.toString()); // ping的状态 int status = p.waitFor(); if (status == 0) { result = "success"; return true; } else { result = "failed"; } } catch (IOException e) { result = "IOException"; } catch (InterruptedException e) { result = "InterruptedException"; } finally { Log.d("----result---",

前面一篇高仿launcher和墨迹左右拖动效果获得了很多朋友的好评,上一篇文章主要是通过自定义ViewGroup实现的,有点麻烦。今天用ViewPager这个类实现了同样的效果,这样代码更少,但是效果是一样的。ViewPager是实现左右两个屏幕平滑地切换的一个类,它是Google提供的。 使用ViewPager首先需要引入android-support-v4.jar这个jar包。具体ViewPager的用法,这里不做介绍,自己从网上搜索吧! 下面先看一下效果:         效果请自行体验和上一篇比较。下面上代码: 首先是layout下面的main.xml 复制代码 代码如下: <?xmlversion="1.0"encoding="utf-8"?> <FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="fill_parent" android:layout_height="wrap_content"/> <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout android:id="@+id/viewGroup" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_marginBottom="30dp" android:gravity="center_horizontal" android:orientation="horizontal"> </LinearLayout> </RelativeLayout> </FrameLayout> 接下来为每一个切换界面设置布局item1.xml 复制代码 代码如下: <?xmlversion="1.0"encoding="UTF-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <ImageView android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/guide01"> </ImageView> </LinearLayout> 其他的几个界面布局和这个一样,就是修改下背景图片,所以不再复述, 最后是核心代码: 复制代码 代码如下: importjava.util.ArrayList; importandroid.app.Activity; importandroid.os.Bundle; importandroid.os.Parcelable; importandroid.support.v4.view.PagerAdapter; importandroid.support.v4.view.ViewPager; importandroid.support.v4.view.ViewPager.OnPageChangeListener; importandroid.view.LayoutInflater; importandroid.view.View; importandroid.view.ViewGroup; importandroid.view.ViewGroup.LayoutParams; importandroid.view.Window; importandroid.widget.ImageView; publicclassMainActivityextendsActivity{ ViewPagerviewPager; ArrayList<View>list; ViewGroupmain,group; ImageViewimageView; ImageView[]imageViews; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); LayoutInflaterinflater=getLayoutInflater(); list=newArrayList<View>(); list.add(inflater.inflate(R.layout.item1,null)); list.add(inflater.inflate(R.layout.item2,null)); list.add(inflater.inflate(R.layout.item3,null)); list.add(inflater.inflate(R.layout.item4,null)); list.add(inflater.inflate(R.layout.item5,null)); imageViews=newImageView[list.size()]; ViewGroupmain=(ViewGroup)inflater.inflate(R.layout.main,null); //group是R.layou.main中的负责包裹小圆点的LinearLayout. ViewGroupgroup=(ViewGroup)main.findViewById(R.id.viewGroup); viewPager=(ViewPager)main.findViewById(R.id.viewPager); for(inti=0;i<list.size();i++){ imageView=newImageView(MainActivity.this); imageView.setLayoutParams(newLayoutParams(10,10)); imageView.setPadding(10,0,10,0); imageViews[i]=imageView; if(i==0){ //默认进入程序后第一张图片被选中; imageViews[i].setBackgroundResource(R.drawable.guide_dot_white); }else{ imageViews[i].setBackgroundResource(R.drawable.guide_dot_black); } group.addView(imageView); } setContentView(main); viewPager.setAdapter(newMyAdapter()); viewPager.setOnPageChangeListener(newMyListener()); } classMyAdapterextendsPagerAdapter{ @Override publicintgetCount(){ returnlist.size(); } @Override publicbooleanisViewFromObject(Viewarg0,Objectarg1){ returnarg0==arg1; } @Override publicintgetItemPosition(Objectobject){ //TODOAuto-generatedmethodstub returnsuper.getItemPosition(object); } @Override publicvoiddestroyItem(Viewarg0,intarg1,Objectarg2){ //TODOAuto-generatedmethodstub ((ViewPager)arg0).removeView(list.get(arg1)); } @Override publicObjectinstantiateItem(Viewarg0,intarg1){ //TODOAuto-generatedmethodstub ((ViewPager)arg0).addView(list.get(arg1)); returnlist.get(arg1); } @Override publicvoidrestoreState(Parcelablearg0,ClassLoaderarg1){ //TODOAuto-generatedmethodstub } @Override publicParcelablesaveState(){ //TODOAuto-generatedmethodstub returnnull; } @Override publicvoidstartUpdate(Viewarg0){ //TODOAuto-generatedmethodstub } @Override publicvoidfinishUpdate(Viewarg0){ //TODOAuto-generatedmethodstub } } classMyListenerimplementsOnPageChangeListener{ @Override publicvoidonPageScrollStateChanged(intarg0){ //TODOAuto-generatedmethodstub } @Override publicvoidonPageScrolled(intarg0,floatarg1,intarg2){ //TODOAuto-generatedmethodstub } @Override publicvoidonPageSelected(intarg0){ for(inti=0;i<imageViews.length;i++){ imageViews[arg0] .setBackgroundResource(R.drawable.guide_dot_white); if(arg0!=i){ imageViews[i] .setBackgroundResource(R.drawable.guide_dot_black); } } } } } 最后在提醒一句,不要忘记加入android-support-v4.jar这个jar包。

在Android 中有一种服务说是服务其实倒不如说是一个接口,这个接口名为:Android Interface Definition Language ,这个接口可提供跨进程访问服务,英文缩写为:AIDL。此种服务的好处在于,多个应用程序之间建立共同的服务机制,通过AIDL在不同应用程序之间达到数据的共享和数据相互操作,下面将通过一个DEMO 演示AIDL 是如何为应用程序之间提供服务的。本文大纲为:•1、创建AIDL 服务端。•2、创建AIDL 客户端。•3、客户端调用服务端提供的服务接口。•4、小结。本文要实现的功能大致如下:创建AIDL服务端,此服务端将提供一个Student 的javabean 提供客户端取得数据,因为aidl 支持的数据类型比较简单,故这里建议把常用的数据类型的数据写入服务。1、创建AIDL 服务端在Android 的src 文件夹下的任意包里面新建文件,后缀名为*.aidl,如下图输入如下代码:复制代码 代码如下:package com.aidl.test;import com.aidl.test.Student;interface IMyService{        Map getMap(in String test_class,in Student student);         Student getStudent();}Student 类是一个序列化的类,这里使用Parcelable 接口来序列化是Google 提供的一个比Serializable 效率更高的序列化类。Student  类代码如下:复制代码 代码如下:package com.aidl.test;import android.os.Parcel;import android.os.Parcelable;public class Student implements Parcelable {    private int age;    private String name;    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public static final Parcelable.Creator<Student> CREATOR = new Creator<Student>() {        @Override        public Student[] newArray(int size) {            // TODO Auto-generated method stub            return new Student[size];        }        @Override        public Student createFromParcel(Parcel source) {            // TODO Auto-generated method stub            return new Student(source);        }    };    public Student() {    }    public Student(Parcel pl) {        age = pl.readInt();        name = pl.readString();    }    @Override    public int describeContents() {        // TODO Auto-generated method stub        return 0;    }    @Override    public void writeToParcel(Parcel dest, int flags) {        // TODO Auto-generated method stub        dest.writeInt(age);        dest.writeString(name);    }}在这里必须注意,编写javabean时必须注意如下三点:•在Student 类中必须有一个静态常量,常量名必须是CREATOR,而且CREATOR 常量的数据类型必须是 Parcelable.Creator•在writeToParcel 方法中需要将要序列化的值写入到 Parcel对象中。•编写完Student 为时,必须再新建一个Student.aidl 文件,此文件输入以下内容:parcelable Student; 这里的书写是供上面我们说过的接口   *.aidl 文件导包时可以找到,并通过此文件找到Student类对象。如果上面的步骤顺利通过的话,Android 将会自动在gen 目录下R文件的相同目录生成一个以*.aidl 文件命名的*.java 文件,如下图:顺利生成成功后,我们再来编写一个AIDL 服务类,代码如下:复制代码 代码如下:package com.aidl.test;import java.util.HashMap;import java.util.Map;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.RemoteException;public class MyService extends Service {    @Override    public IBinder onBind(Intent intent) {        // TODO Auto-generated method stub        return new MyServiceimpl();    }    public class MyServiceimpl extends IMyService.Stub {        @Override        public Student getStudent() throws RemoteException {            // TODO Auto-generated method stub            Student st = new Student();            st.setAge(18);            st.setName("terry");            return st;        }        @Override        public Map getMap(String testClass, Student student)                throws RemoteException {            // TODO Auto-generated method stub            Map<String, Object> map = new HashMap<String, Object>();            map.put("class", "五年级");            map.put("age", student.getAge());            map.put("name", student.getName());            return map;        }    }}如上代码,MyService 服务类有一个子类并继承自我们上面生成的*.java 文件重写其中我们在*.aidl 中声明的两个接口方法,实现了其功能。上面IBinder 必须返回此服务类的子类对象,否则客户端将无法获得服务对象。最后,即然有服务的操作,那么就得在manifest文件中注册服务类,代码如下:复制代码 代码如下:<service android:name=".MyService">    <intent-filter>        <action android:name="com.aidl.test.IMyService"></action>    </intent-filter></service>至此,服务端就己经开发完成了,下面接着开发客启端。2、创建AIDL 客户端 同样是新建一个项目,这里要注意,需要将服务端生成成功后的gen 目录下的包复制过来,放到我们新建项目的src 文件夹下,如下图:因为IMyService 这个生成类,引用到了Student 这个javabean 所以这里一并将javabean也复制过来。至此,客户端的创建己经完毕,下面我们就要利用创建的客户端去调用服务端的方法。3、客户端调用服务端提供的服务接口先看一下运行效果:细心的朋友会发现,上面的数据不是我们在上面客户端为Student 设置的数据吗?怎么在这个程序 里面也同样得到了?没错。这就是aidl 的魅力,下面来看看如何调用 吧,图中有两个按钮,一个按钮为绑定AIDL 服务,即通过Activity 的 bindService 绑定 AIDL 外部服务,全部代码如下:复制代码 代码如下:package com.aidl.client;import com.aidl.test.IMyService;import android.app.Activity;import android.app.AlertDialog;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class aidlActivity extends Activity implements OnClickListener {    Button btn1, btn2;    private IMyService myService = null;    private ServiceConnection serviceConnection = new ServiceConnection() {        @Override        public void onServiceDisconnected(ComponentName name) {            // TODO Auto-generated method stub        }        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            // TODO Auto-generated method stub            myService = IMyService.Stub.asInterface(service);            btn2.setEnabled(true);        }    };    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        btn1 = (Button) findViewById(R.id.Button01);        btn2 = (Button) findViewById(R.id.Button02);        btn2.setEnabled(false);        btn1.setOnClickListener(this);        btn2.setOnClickListener(this);    }    @Override    public void onClick(View v) {        // TODO Auto-generated method stub        switch (v.getId()) {        case R.id.Button01:            bindService(new Intent("com.aidl.test.IMyService"),                    serviceConnection, Context.BIND_AUTO_CREATE);            break;        case R.id.Button02:            StringBuilder sb = new StringBuilder();            try {                sb.append("学生名称为:" + myService.getStudent().getName() + "\n");                sb.append("年龄为:" + myService.getStudent().getAge() + "\n");                sb.append("map 对象内容为如下:"                        + myService.getMap("中国", myService.getStudent())                                .toString());            } catch (RemoteException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            new AlertDialog.Builder(aidlActivity.this).setTitle("调用外部服务")                    .setMessage(sb.toString()).setPositiveButton(                            android.R.string.ok, null).show();            break;        default:            break;        }    }}在ServiceConnetction里面对IMyService 进行初始化,即可操作该对象 ,该对象就可以得到我们所有要处理的数据。4、小结•aidl 文件调用javabean 的aidl文件必须导包;•javabean 必须序列化,如果没有用javabean可以用简单的变量代替,如返回一个整型,返回一个字符串等。•使用aidl 必须同时存在客户端和服务端,即客户端在本机上,服务端也在本机上,要使用客户端必须服务端事先在本机上注册过服务。代码下载:

在Android的应用开发中,我们会用到各种代码调试;其实在Android的开发之后,我们可能会碰到一些随机的问题,如cpu过高,内存泄露等,我们无法简单的进行代码调试,我们需要一个系统日志等等,下面我把握工作中碰到的几个常用命令和方法给大家演示实践一下。1.logcat命令这个命令最简单常用,可查看帮助,我不多说,如果需要打印时间,加参数-v timeadb logcat -v time2.bugreport命令这个命令也非常简单,但是在实际应用中非常有用,会有从开机之后详细的dumpsys,dumpstate和logcat信息,是一份完整的日志记录。对分析用户行为,异常信息,系统状态有很大的参考作用。一般我们会把bugreport导出到电脑上分析。adb bugreport > xxx.log我再次强调,bugreport里面包含丰富的系统和用户信息,它是其他很多命令输出的结果的记录,非常有用。3.dumpsys命令这个查看系统信息,用的还是比较多的.复制代码 代码如下:dumpsys [options]               meminfo 显示内存信息               cpuinfo 显示CPU信息               account 显示accounts信息               activity 显示所有的activities的信息               window 显示键盘,窗口和它们的关系               wifi 显示wifi信息例如查看某个程序内存信息:复制代码 代码如下:#查看应用com.tianxia.test的内存使用情况adb shell dumpsys meminfo com.tianxia.test效果图如下:里面的信息很有价值,尤其对于分析内存泄露,内存溢出都有极大的作用。4.top命令这个查看cpu信息太方便了。top -m 5 -t我们看看效果图,其中按cpu大小列出5个进程列表。com.tianxia.test的cpu过高,会导致手机发烫。同时利用这个信息,可以监控应用cpu的使用,以调整优化代码。5.配置文件local.prop目前网上没有查到local.prop的配置使用,工作中本人只使用过如下:log.tag.SQLiteStatements=VERBOSE log.tag.SQLiteTime=VERBOSE把上述文本加到/data/local.prop中,如果没有这个文件自行创建。然后重启手机,就能看到每个应用详细的查询数据库的sql语句信息,对于调试数据库,分析和优化数据库sql异常非常有用。6.分析手机发烫下面我们来实践一个例子,手机发烫太厉害,怎么找出问题?首先我们写一个程序com.tianxia.test,死循环,核心代码如下:复制代码 代码如下:@Overridepublic void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);    while(true) {        System.currentTimeMillis();    }}这个应用打开后会一直获取系统时间,因为在主线程,肯定导致应用ANR,也会一直浪费系统cpu,手机发热,我们运行它。假设我们不知道上述代码,我们来找到这个问题:(1).找到发烫的应用。使用top命令:top -m 5 -t一看是com.tianxia.test占用85%的cpu,原来是这家伙在捣鬼。进程ID是644,这个后面我们有用。(2).分析发烫的应用进程在干嘛需要用到linux下的strace命令,但是android是没有集成这个命令的,android版本的下载地址:http://benno.id.au/android/strace下载完成后,上传到手机中:我们adb push strace /system/bin,在模拟器上是上传到/system/bin会报out of memory错误,我们也可以上传到/data目录下,如果没有执行权限,还需要chmod 777 strace.strace命令有很多参数,直接执行strace会显示使用说明:其中-p参数输入的就是进程号,第一步中我们找到com.tianxia.test的进程ID是644,我们看看这个应用占用这么高的cpu在干嘛?strace -p 644输出如下:它的系统调用一直是gettimeofday,一直输出这个,显然哪里一定进入死循环了,而且是获取时间的死循环,然后结合logcat和代码,定位这段代码(就是前面我们给出的那段代码了)解决这个bug。7.采集手机的cpu运行情况.有时使用日志我们很难针对性的获取我们想要的信息,我们可能需要写一些最简单的脚步放在手机里面执行。如监控cpu占用的记录cpu_log.sh:复制代码 代码如下:# !/system/bin/sh#这个脚步比较粗糙,是这么个意思file=/sdcard/cpu/cpu_info.logrm $fileuntil [ 1 -gt 10000 ]doecho -e "\n\n\n\n\n---------------">>$filedate >> $filetop -m 5 -n 1 >> $filesleep 3done每隔3s中就会把手机的cpu的信息写到sdcard的cpu目录下的cpu_info.log文件中,方便我们后续分析。 ps:使用方法是 push到data目录下,赋予可执行权限,在shell下执行即可。8.采集某个应用的内存数据这个实践和上面的脚本类似,只是命令不一样我另外单独列出来,因为这个有时候很有用。比如,我们要采集com.tianxia.test的内存使用情况,分析它是不是会内存泄露,脚步类似:复制代码 代码如下:# !/system/bin/sh#这个脚步比较粗糙,是这么个意思file=/sdcard/cpu/mem_info.logrm $fileuntil [ 1 -gt 10000 ]doecho -e "\n\n\n\n\n---------------">>$filedate >> $filedumpsys meminfo com.tianxia.test >> $filesleep 3done使用方法也是一样。

1、安装JDK其实这一步我比较偷懒,在网上查了一下Ubuntu系统下安装JDK的方法,看起来稍稍有点麻烦,于是我试着在自带的软件中心里搜了一下,然后发现在软件中心里有个OpenJDK Java 7,尝试着安装后,发现这是个好东西,一键安装后环境变量什么的都已经自动配好了,eclipse什么的都能自动识别,很方便。百度了一下Open JDK和sun JDK的区别,大概就是sun公司的JDK是在Open JDK的基础上开发的,扩展了一些东西。经过这段时间的使用,在开发Android的时候没发现有什么差别,很好用~所以推荐大家直接在软件中心安装OpenJDK就好。2、下载ADTBundle现在不管在什么系统上安装Android开发工具其实都是一件很简单的事情,因为在Android官网上能找到适合三大操作系统(Windows、Mac、Linux)的开发工具,不管是集成了Eclipse、Android SDK和ADT的ADTBundle,还是Google公司专门推出的Android Studio,都能找到适合自己操作系统的下载,非常方便。唯一不方便的就是现在由于Google被伟大的GFW隔在外面,导致Android官网也无法正常访问,所以……翻墙吧。如果在Ubuntu上翻墙不方便的话,可以现在Windows上下载好,然后拷贝过来。至于选择Android Studio还是ADTBundle,我建议还是后者吧。尝试过安装Android Studio,可是死活打不开,然后就放弃了,而且确实现在在很多方面都还不完善,还是老老实实地用Eclipse吧。进入Android官网,在下面找到Developer,然后在Tools里面下载ADTBundle到任意文件夹。解压下载好的zip文件,里面会有两个文件夹,eclipse和sdk,分别用来装什么的想必不用我多说了吧。3、更新SDK虽然刚下载好的ADTBundle是集成了SDK的,但往往都不太完整,比如最新版本里只包含Android 4.4w(专门给Android Wear准备的开发包),如果需要Android L或者之前版本的开发包,还是需要通过SDK manager。打开eclipse,从eclipse上面的快捷栏打开SDK manager,你会发现根本无法获取到各个版本的SDK包,还是因为GFW的缘故,没办法,只能另想办法。如果你自己购买有VPN的话,可以在SDK manager窗口任务栏点击Tools-Options,然后将你VPN的IP和端口填入,之后重启SDK manager,就会发现所有的SDK包都加载出来了,选择你所需要的包下载即可。当然,如果你和我一样穷屌丝买不起VPN的话,还有一个最简单的办法,改hosts。打开终端,输入:sudo gedit /etc/hosts然后把以下两行添加到后面203.208.46.146 dl-ssl.google.com203.208.46.146 dl.google.com这是最新的ip地址,加载速度很快,下载SDK的时候基本上能达到自己的带宽速度。添加好后,保存退出。重启SDK manager,同样发现SDK已经可以加载出来并下载了,选择你所需要的包下载即可。4、安装Genymotion模拟器虽然ADT里自带的AVD能够模拟Android设备来调试测试开发的android应用,但是用过的人都知道,简直卡得一逼,做为一个有强迫症的人来说实在无法忍受。虽然在Windows系统下已经能通过使用Intel x86镜像加速Android模拟器了,但目前却还不支持Linux系统,而且加速效果也没有想象中那么好。而我今天推荐的这个Genymotion模拟器,相当流畅,几乎能媲美真机的速度,不管是开机还是加载程序都相当畅爽。进入Genymotion官网,点击下载,输入你的邮箱,在邮箱中通过验证后进入下载页面。(注意,邮箱验证成功后的那封提示邮件不要删除,里面会有你的用户名Username,之后要用)在下载页面先不要急着下载Genymotion,在那之前需要先安装Oracle VirtualBox,下载下来的是个deb包,直接双击安装即可。安装好后,下载Genymotion,下载下来的是个.bin文件,需要通过命令行进行安装:打开终端,用cd命令进入存放刚才那个bin文件的目录,然后输入以下命令:chmod a+x 文件名sudo ./文件名注意第二句执行命令/前有个点.之后便进入安装程序,安装好即可。安装好后在安装目录找到genymotion,打开,会自动提示你添加设备,yes之后,点击下面的connect按钮,输入用户名和密码(用户名是之前邮件里那个)登陆,然后就可以自由添加android虚拟设备了,添加好用点play运行模拟器,好好感受一下这个模拟器的流畅吧!以后开发的时候再也不用羡慕ios开发者有个很棒的模拟器了~好了,至此你的Android开发环境已经搭好了,赶快新建一个Android项目,

焦点访谈

最新最热的文章

更多 >

COPYRIGHT (©) 2017 Copyright ©2017 腾博会官网 网站地图

联系我们

827570882

扫描二维码分享到微信