編輯:關於Android編程
Android應用程序記錄(Android Application Record---AAR)
在Android4.0(API Level 14)中引入的Android應用程序記錄(AAR),提供了較強的在掃描到NFC標簽時,啟動應用程序的確定性。AAR有嵌入到NDEF記錄內部的應用程序的包名。你能夠把一個AAR添加到你的NDEF消息的任何記錄中,因為Android會針對AAR來搜索整個NDEF消息。如果它找到一個AAR,它就會基於AAR內部的包名來啟動應用程序。如果該應用程序不在當前的設備上,會啟動Google Play來下載對應的應用程序。
如果你想要防止其他的應用對相同的Intent的過濾並潛在的處理你部署的特定的NFC標簽,那麼AAR是有用的。AAR僅在應用程序級被支持,因為包名的約束,並不能在Activity級別來過濾Intent。如果你想要在Activity級處理Intent,請使用Intent過濾器。
如果NFC標簽中包含了AAR,則NFC標簽調度系統會按照下列方式來調度:
1. 通常,嘗試使用Intent過濾器來啟動一個Activity。如果跟該Intent匹配的Activity也跟AAR匹配,那麼就啟動該Activity。
2. 如果跟Intent隊形的Activity跟AAR不匹配,或者是有多個Activity能夠處理該Intent,或者是沒有能夠處理該Intent的Activity存在,那麼就啟動由AAR指定的應用程序。
3. 如果沒有跟該AAR對應的應用程序,那麼就會啟動Google Play來小組基於該AAR的應用程序。
注意:你能夠用前台調度系統來重寫AAR和Intent調度系統,在NFC標簽被發現時。它允許優先使用前台的Activity。用這種方法,Activity必須是在前台來重寫AAR和Intent調度系統。
如果你依然想要過濾掃描到的沒有包含AAR的NFC標簽,通常,你能夠聲明Intent過濾器。如果你的應用程序對不包含AAR的其他NFC標簽感興趣,這種做法是有用的。例如,你可能想要保證你的應用程序處理你部署的專用NFC標簽,以及由第三方部署的普通的NFC標簽。要記住AAR是在Android4.0以後才指定的,因此部署NFC標簽時,你很可能希望使用能夠廣泛支持AAR和MIME類型/URI的是設備。另外,在你部署NFC標簽時,還要想如何編寫你的NFC標簽,以便讓大多數設備(Android設備和其他設備)支持。同過定義相對唯一的MIME類型或URI,讓應用程序更容易的區分,就可以做到這一點。
Android提供了簡單的創建AAR的API:createApplicationRecord()。你需要做的所有工作就是把AAR嵌入到你的NdefMessage中。除非AAR是NdefMessage中的唯一記錄,否則不要把使用NdefMessage的第一條記錄。這是因為,Android系統會檢查NdefMessage的第一條記錄來判斷NFC標簽的MIME類型或URI,這些信息被用於創建對應應用程序的Intent對象。以下代碼演示了如何創建一個AAR:
NdefMessage msg = new NdefMessage(
new NdefRecord[] {
...,
NdefRecord.createApplicationRecord("com.example.android.beam")}
把NDEF消息發射到其他設備上
Android Beam允許在兩個Android設備之間進行簡單的對等數據交換,想要把數據發送給另一個設備的應用程序必須是在前台,並且接收數據的設備必須不被鎖定。當發射設備跟接收設備的距離足夠近的時候,發射設備會顯示“Touch to Beam(觸摸發射)”的UI。然後,用戶能夠選擇是否把消息發射給接收設備。
注意:在API Level 10中可以利用前台的NDEF推送,它提供了與Android Beam類似的功能。這些API已經過時了,但是在一些老舊設備上還有效。更多的信息請看enableForegroundNdefPush()。
通過調用下列兩個方法中的任意一個,就能夠為你的應用程序啟用Android Beam:
1. setNdefPushMessage():這個方法把接收到的NdefMessage對象作為一個消息設置給Beam。當兩個設備足夠近的時候,就會自動的發送消息。
2. setNdefPushMessageCallback():接收包含createNdefMessage()方法的回調,當設備在發射數據的范圍內時,這個回調方法會被調用。回調會讓你只在需要的時候創建NDEF消息。
一個Activity一次只能推送一條NDEF消息,因此如果同時使用了這兩種方法,那麼setNdefPushMessageCallback()方法的優先級要高於setNdefPushMessage()方法。要使用Android Beam,通常必須滿足以下條件:
1. 發射數據的Activity必須是在前台。兩個設備的屏幕都必須沒有被鎖定;
2. 必須發要發射的數據封裝到一個NdefMessage對象中;
3. 接收發射數據的NFC設備必須支持com.android.npp NDEF推送協議或是NFC組織的SNEP協議(簡單的NDEF交換協議)。在API Level9(Android2.3)到API Level 13(Android3.2)的設備上需要com.android.npp協議。在API Level 14(Android4.0)和以後的設備上,com.android.npp和SNEP都需要。
注意:如果在前台的Activity啟用了Android Beam,那麼標准的Intent調度系統就會被禁用。但是,如果該Activity還啟用了前台調度,那麼在前台調度系統中,它依然能夠掃描到跟Intent過濾器匹配的NFC標簽。
啟用Android Beam:
1. 創建一個准備推送到另一個設備上的包含NdefRecord的NdefMessage對象。
2. 調用帶有NdefMessage類型參數的setNdefPushMessage()方法,或者是在Activity的onCreate()方法中調用setNdefPushMessageCallback方法來傳遞實現NfcAdapter.CreateNdefMessageCallback接口的對象。這兩個方法都至少需要一個准備要啟用Android Beam的Activity,以及一個可選的其他的活躍的Activity列表。
通常,如果你的Activity在任何時候都值推送相同的NDEF消息,那麼當兩個設備在通信范圍內的時候,使用setNdefPushMessage()就可以了。當你的應用程序要關注應用程序的當前內容,並想要根據用戶在你的應用程序中的行為來推送NDEF消息時,就要使用setNdefPushMessageCallback方法。
下列示例代碼演示了如何在activity的onCreate()方法中調用NfcAdapter.CreateNdefMessageCallback方法(完整的示例請看AndroidBeamDemo)。這個示例中還有幫助創建MIME記錄的方法:
package com.example.android.beam;
import android.app.Activity;
import android.content.Intent;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.NfcAdapter.CreateNdefMessageCallback;
import android.nfc.NfcEvent;
import android.os.Bundle;
import android.os.Parcelable;
import android.widget.TextView;
import android.widget.Toast;
import java.nio.charset.Charset;
public class Beam extends Activity implements CreateNdefMessageCallback {
NfcAdapter mNfcAdapter;
TextView textView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView textView = (TextView) findViewById(R.id.textView);
// Check for available NFC Adapter
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (mNfcAdapter == null) {
Toast.makeText(this, "NFC is not available", Toast.LENGTH_LONG).show();
finish();
return;
}
// Register callback
mNfcAdapter.setNdefPushMessageCallback(this, this);
}
@Override
public NdefMessage createNdefMessage(NfcEvent event) {
String text = ("Beam me up, Android!\n\n" +
"Beam Time: " + System.currentTimeMillis());
NdefMessage msg = new NdefMessage(
new NdefRecord[] { createMime(
"application/vnd.com.example.android.beam", text.getBytes())
/**
* The Android Application Record (AAR) is commented out. When a device
* receives a push with an AAR in it, the application specified in the AAR
* is guaranteed to run. The AAR overrides the tag dispatch system.
* You can add it back in to guarantee that this
* activity starts when receiving a beamed message. For now, this code
* uses the tag dispatch system.
*/
//,NdefRecord.createApplicationRecord("com.example.android.beam")
});
return msg;
}
@Override
public void onResume() {
super.onResume();
// Check to see that the Activity started due to an Android Beam
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
processIntent(getIntent());
}
}
@Override
public void onNewIntent(Intent intent) {
// onResume gets called after this to handle the intent
setIntent(intent);
}
/**
* Parses the NDEF Message from the intent and prints to the TextView
*/
void processIntent(Intent intent) {
textView = (TextView) findViewById(R.id.textView);
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(
NfcAdapter.EXTRA_NDEF_MESSAGES);
// only one message sent during the beam
NdefMessage msg = (NdefMessage) rawMsgs[0];
// record 0 contains the MIME type, record 1 is the AAR, if present
textView.setText(new String(msg.getRecords()[0].getPayload()));
}
}
注意:上例代碼把AAR給注釋掉了,你可以刪除它。如果你啟用了AAR,那麼該應用程序就會始終接收在AAR中指定的Android Beam消息。如果該應用程序不存在,Google Play就會啟動下載程序。因此,如果使用AAR,對於Android4.0以後的設備,下列的Intent過濾器,在技術上不是必須的:
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="application/vnd.com.example.android.beam"/>
</intent-filter>
有了這個Intent過濾器,com.example.android.beam應用就能夠在以下情況下被啟動:
1. 掃描到NFC標簽;
2. 接收到com.example.android.beam類型的AAR或NDEF消息中包含一條application/vnd.com.example.android.beam類型的MIME記錄的Android beam的時候。
即使通過AAR能夠保證了一個應用程序被啟動或下載,但是還是推薦使用Intent過濾器,因為它會讓你選擇啟動應用程序中Activity,而不是總啟動AAR中指定的應用程序包的主Activity。AAR沒有Activity級別的粒度。而且還有一些android設備不支持AAR,你還應該在NDEF消息的第一條NDEF記錄中嵌入標識信息,以及對應的過濾器。
Android Studio常用插件轉載請注明出處: http://blog.csdn.net/crazy1235/article/details/48598803不得不
今天給大家詳解一下Android中Activity的生命周期,我希望我的講解不像網上大多數文章一樣,基本都是翻譯Android API,過於籠統,相信大家看了,會有一點點
Android 自定義toast 寬高大小 背景圖片 RelativeLayout layout = (RelativeLayout) getLayoutInfl
前面幾篇我們講解了 QtAndroid 名字空間的基本用法,這次我們使用前面講過的方法和類庫,展示一些簡單的小示例。我在《Qt on Android核心編程》一書中主要通