1. android怎麼把其他app的內容分享到自己的app里
很多時候我們的應用在使用微信分享內容之後,希望其他用戶點擊該分享內容能夠跳轉到我們的App,以實現閉環,這樣的分享才是最有價值的。這種需求涉及到不同應用之間的交互,雖然微信提供了分享SDK,但仍然有不少限制,現在總結兩種在Android平台上初步認為可行的方案:
1.分享網頁,從分享的網頁跳轉回原App。
2.分享WXAppExtendObject類型的數據,且只能分享給好友,好友從聊天列表點擊收到的分享內容可以直接跳轉第三方App(前提是好友手機上已經安裝了該App)。下面來詳細說明兩個方案,由於是在項目中實測的,為了隱私及行文方便,假設我們的應用的名字為MyApp,效果截圖也就不再展示。
方案一:
從WebView(該WebView從屬於另一個App,並非我們自己的App)跳轉到MyApp的某個界面(這里以跳轉到MyApp的Acticity A為例)。具體的實現邏輯如下:
(1)該WebView顯示的網頁內容只是一個超鏈接,自定義了一個scheme=myapp://,後邊可以附加一些參數,如果需要從網頁向App傳值的話。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>This is title</title>
</head>
<body>
<a href=』myapp://id=909624′>Jump to MyApp</a>
</body>
</html>
該網頁在WebView打開後就是一個簡單的超鏈接,截圖不再附。
(2)MyApp中的Activity A需要配置特定的infliter,如下:
<activity
<intent-filter>
<data android:scheme="myapp" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
(3)當在WebView上點擊上述自定義的超鏈接時就可以打開MyApp的A界面,所傳遞的參數也可以在所跳轉到的Activity中獲取,方法如下:
getIntent().getScheme();//獲得Scheme名稱
getIntent().getDataString();//獲得Uri全部路徑,根據自定義的格式解析字元串即可獲取我們上面附加的參數。可行的實施方案:
MyApp中調用微信分享分享網頁內容,只需要在網頁中嵌入跟Android客戶端約定好的超鏈接協議scheme,那麼點擊時就可以跳轉到MyApp。
問題1:如果用戶安裝了MyApp,就可以點擊網頁跳轉,如果沒有安裝MyApp的話,WebView就會提示找不到該頁面。製作網頁時可以在網頁中做檢測,沒安裝MyApp的話,頁面就重定向到應用的下載頁面。
問題2:在普通App的WebView中和瀏覽器中上述機制是可以的,但是在微信的WebView是不可以點擊直接跳轉我們的應用的,可能是微信做了某些過濾,且僅僅支持跟微信有深度合作的應用的跳轉,如大眾點評是可以的。針對這種情況,我們可以引導用戶使用瀏覽器打開所分享的網頁,然後點擊就可以跳轉應用了。方案二:
使用微信SDK分享WXAppExtendObject數據給好友,好友點擊跳轉MyApp的某個頁面(需要在分享時傳遞構造跳轉Intent的參數)。
1.該類型的分享(具體請參考微信分享SDK)可以帶幾個參數,參數中必須附帶一些構造跳轉Intent的數據。
2.好友點擊分享的內容,回調IWXAPIEventHandler介面的類的onReq方法,具體為
ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:這種情況才會調用,此時可以取出分享時附帶在參數中的一些數據,構造一個跳轉Intent,調用startActivity(intent) 來打開MyApp。
由於是項目實測,這種實現方式的截圖也就不傳了。
問題1:該分享方式只能分享給好友,不能分享到朋友圈。
問題2:如果好友沒安裝MyApp,點擊微信中好友分享過來的消息後無反應,無法提醒「未安裝MyApp,請下載」,因為這些邏輯要實現的話本身就是在MyApp裡面寫的,原本沒裝的話根本無法檢測。
問題3:WXAppExtendObject類型的分享,數據有大小限制,
extInfo(String)限制2KB;
fileData(byte[])供第三方使用的文件二進制數據,最大10M;
filePath:(String)Local directory of the file provided for applications,本身長度最大10KB,文件大小同上,不超過10M。以上就是Android平台好友點擊微信分享的內容後跳轉來源App的兩種實現方案,各有優點和局限性,請根據自身業務需求選擇合適的分享方式,由於未能附截圖說明,如有哪裡表述不清楚的,歡迎留言討論。
2. 如何android多Activity間共享數據
其實有如下5種方式:
1.基於消息的通信機制 Intent ---boudle ,extra
數據類型有限,比如遇到不可序列化的數據Bitmap,InputStream, 或者LinkList鏈表等等數據類型就不太好用。
2. 利用static靜態數據,public static成員變數;
3.基於外部存儲的傳輸, File/Preference/ Sqlite ,如果要針對第三方應用需要Content Provider
4.基於IPC的通信機制context 與Service之間的傳輸,如Activity與Service之間的通信,定義AIDL介面文件。
5. 基於Application Context
這裡面我覺得第五種方法更具普適性,在網上找了篇講解得好的文章,原文如下:
在Android中使用Intent在兩個Activity間傳遞數據時,只能是基本類型數據,或者是序列化對象。Intent是一種基於消息的進程內和進程間通信模型,當我們需要在我們應用程序內部,多個Activity間進行復雜數據對象共享交互時,使用Intent就顯得很不方便。此時,我們就需要一種數據共享的機制來實現。當然,直接使用java語言中的靜態變數是可以的,但在Android中有更為優雅的實現方式。
The more general problem you are encountering is how to save stateacross several Activities and all parts of your application. A staticvariable (for instance, a singleton) is a common Java way of achievingthis. I have found however, that a more elegant way in Android is toassociate your state with the Application context.
--如想在整個應用中使用,在java中一般是使用靜態變數,而在android中有個更優雅的方式是使用Application context。
As you know, each Activity is also a Context, which is informationabout its execution environment in the broadest sense. Your applicationalso has a context, and Android guarantees that it will exist as asingle instance across your application.
--每個Activity 都是Context,其包含了其運行時的一些狀態,android保證了其是single instance的。
The way to do this is to create your own subclass of android.app.Application,and then specify that class in the application tag in your manifest.Now Android will automatically create an instance of that class andmake it available for your entire application. You can access it fromany context using the Context.getApplicationContext() method (Activityalso provides a method getApplication() which has the exact sameeffect):
--方法是創建一個屬於你自己的android.app.Application的子類,然後在manifest中申明一下這個類,這是android就為此建立一個全局可用的實例,你可以在其他任何地方使用Context.getApplicationContext()方法獲取這個實例,進而獲取其中的狀態(變數)。
class MyApp extends Application { private String myState; public String getState(){ return myState; } public void setState(String s){ myState = s; } } class Blah extends Activity { @Override public void onCreate(Bundle b){ ... MyApp appState = ((MyApp)getApplicationContext()); String state = appState.getState(); ... } }
對於Application的生命周期,今天測試了一下,Application類型在該APP被install的時候就已經實例化了,並且onCreate也已經被調用了。
如果需要創建類型裡面可能需要用到的對象的話,就可以在構造函數裡面實現,但是如果需要將該類型bind Service或者registerReceiver等操作時,需要將這些操作放到onCreate中,否則會拋出異常。其原因主要是這個對象還沒有創建完成,此時你用這個對象來bindservice必然會出現意想不到的情況,所以在使用時還需要注意。
3. 如何利用Android手機共享熱點讓筆記本無線上網
若需將手機流量分享給其他設備上網,請操作:
1.手機上開啟移動數據功能並選擇接入點為NET接入點。接入點更改方式:設定-更多設置(更多網路)-移動網路-接入點名稱-選擇需要的接入點。
2.設定-更多設置(或連接)-網路分享和攜帶型熱點-攜帶型WLAN熱點-向右滑動小圓圈圖標開啟(或移動接入點-打勾)。可自行設置熱點名稱及密碼。
3.使用其他設備搜索手機的無線熱點並連接即可。
註:手機攜帶型熱點功能僅支持在移動數據上網時,共享手機卡流量作熱點使用。開啟該功能後,已連接的無線網路將自動斷開連接。