Intent組件
思維導圖如下:

Intent的決議機制
直接Intent:
public class IntentActivity extends Activity {
public void intentTest() {
//創建一個Intent物件
Intent intent = new Intent();
//指定Intent物件的目標組件是SecondActivity
intent.setClass(IntentActivity.this, SecondActivity.class);
}
間接Intent:
在AndroidManifest.xml組態檔中
<!-- Activity配置-->
<activity android:name=".FirstActivity"
android:label="My Application">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<!-- 應用程式入口-->
<category android:name="android.intent.category.LAUNCHER" />
<!-- 該活動優先級最高-->
</intent-filter>
</activity>
Intent呼叫常用組件
在之前的IntentActivity類中寫的:
/**
* Intent呼叫方法
*/
//啟動瀏覽器
public void intentTest1() {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com"));
startActivity(intent);
}
//啟動瀏覽器并前往http://www.google.com
//啟動撥號程式
public void intentTest2() {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("tel:138"));
startActivity(intent);
}
//啟動撥號程式并輸入號碼”138“
//通話
public void intentTest3() {
Uri uri=Uri.parse("tel:138");
Intent intent = new Intent(Intent.ACTION_CALL, uri);
startActivity(intent);
}
//撥打號碼138.需要為程式申請權限<uses-permission android:name=" android.permission.CALL_PHONE" />
//發送短信
@SuppressLint("IntentReset")
public void intentTest4() {
String url = null;
Uri smsUri=Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, smsUri);
intent.setType("vnd.android-dir/mms-sms");
startActivity(intent);
}
//啟動短信程式
//啟動通訊錄
public void intentTest5() {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("content://contacts/people/1"));
startActivity(intent);
}
//啟動通訊錄的某一條目
//啟動地圖程式
public void intentTest6() {
String url = null;
Uri mapUri=Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, mapUri);
startActivity(intent);
}
//啟動地圖程式
//啟動郵件程式
public void intentTest7() {
Uri uri=Uri.parse("mailto:xxx@example.com");
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
intent.putExtra(Intent.EXTRA_SUBJECT,"Hello world");
intent.putExtra(Intent.EXTRA_TEXT,"Ganbarimasu");
startActivity(intent);
}
//啟動郵件程式并將收件人設為xxx.@example.com,郵件主題設為Hello world,內容設為Ganbarimasu
//啟動郵件程式并添加多個收件人
public void intentTest8() {
Intent intent = new Intent(Intent.ACTION_SEND);
String[] tos={"me@example.com"};
String[] ccs={"you@example.com"};
intent.putExtra(Intent.EXTRA_EMAIL,tos);
intent.putExtra(Intent.EXTRA_CC,ccs);
intent.putExtra(Intent.EXTRA_TEXT,"The email body text");
intent.putExtra(Intent.EXTRA_SUBJECT,"The email subject text");
intent.setType("message/rfc822");
startActivity(Intent.createChooser(intent,"Choose Email Client"));
}
//啟動郵件程式并設定為發送給多個收件人
//啟動地圖程式
public void intentTest9() {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_SUBJECT,"The email subject text");
intent.putExtra(Intent.EXTRA_STREAM,"file:///sdcard/mysong.mp3");
Intent sendIntent = new Intent();
sendIntent.setType("audio/mp3");
startActivity(Intent.createChooser(intent,"Choose Email Client"));
}
//啟動郵件程式并添加附件
//播放MP3檔案
public void intentTest10() {
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri=Uri.parse("file:///sdcard/song.mp3");
intent.setDataAndType(uri,"audio/mp3");
startActivity(intent);
}
//啟動音樂程式并播放MP3歌曲
//安裝應用
public void setupAPK(String apkname) {
String fileName= Environment.getExternalStorageState()+"/"+apkname;
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(fileName)),
"application/vnd.android.package-archive");
Activity mService = new Activity();
mService.startActivity(intent);
}
//呼叫setupAPK方法,傳入應用名稱即可安裝指定的應用
//卸載程式
public void intentTest12() {
String strPackageName = null;
Uri uri=Uri.fromParts("package",strPackageName,null);
Intent intent = new Intent(Intent.ACTION_DELETE,uri);
startActivity(intent);
}
//卸載包名為strPackageName的程式
//啟動設定
public void intentTest13() {
Intent intent = new Intent("android.settings.SETTINGS");
startActivity(intent);
}
//進入設定程式
//從圖庫(Gallery)中選擇并獲取一張圖片
public void intentTest14() {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent,11);
}
//啟動圖庫,從中選擇并獲取一張圖片,回傳源程式
Intent在多Activity中的使用
由一個Activity啟動另一個Activity
/**
* 由一個Activity啟動另一個Activity
* 最常見最一般的頁面跳轉代碼
*/
public void IntentTest15(){
Intent intent=new Intent(IntentActivity.this,SecondActivity.class);
startActivity(intent);
}
//或者
public void IntentTest16(){
Intent intent=new Intent();
intent.setClass(IntentActivity.this,SecondActivity.class);
startActivity(intent);
}
//或者
public void IntentTest17(){
Intent intent=new Intent();
intent.setClass(getApplicationContext(),SecondActivity.class);
startActivity(intent);
}
Activity間的資料交換
public class FirstActivity extends ListActivity {
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
//獲得選中項的HashMap物件
HashMap map = (HashMap) l.getItemAtPosition(position);
String Type = (String) map.get("Type");
Intent i = new Intent(this, Title.class);
//實體化一個Buddle物件
//用putString(標記,資料)來將資料匯入到Buddle物件中
Bundle mBundle = new Bundle();
mBundle.putString("type", Type);
//將Buddle物件匯入到Intent物件中
i.putExtras(mBundle);
//Intent啟動另一個Activity
startActivity(i);
//從Intent中讀出需要的資料,Buddle物件可以從activity.getIntent().getExtras()中回傳
//啟動當前Activity的Intent物件是由getIntent()來找到的
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
//通過Buddle物件的getString()方法,就可以讀出所要的資料
Type = bundle.getString("type");
}
if (Type != null) {
//從資料庫依據所選型別讀出文章的Title,保存在cur中,myDBadapter是資料庫名字
String cur = myDBadapter.getTitle(new String[]{Type});
}
}
/**
* 其他方法簡介
*/
public void intentTest18() {
Intent intent = new Intent();
intent.setClass(FirstActivity.this, SecondActivity.class);
intent.putExtra("Name", "ppy2790");
startActivity(intent);
}
}
帶結果回傳的Activity
public class SecondActivity extends Activity {
/**
*帶結果回傳的Activity
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
Intent intent=new Intent();
switch(requestCode){
case RESULT_OK:
/*取得來自SecondActivity頁面的資料,并顯示到畫面*/
Bundle bundle=data.getExtras();
/*獲取Bundle中的資料,注意型別和key*/
String name=bundle.getString("Name");
boolean ismale=bundle.getBoolean("ismale");
}
//在SecondActivity頁面上加一個回傳按鈕,并在事件寫如下代碼:
/*給上一個Activity回傳結果*/
SecondActivity.this.setResult(RESULT_OK,intent);
/*結束本Activity*/
SecondActivity.this.finish();
}
}
實體!
一個簡單的短信應用——
用到的一些額外的知識點
Cursor類跟平時用的資料庫中的游標類似,它提供了從資料庫回傳的結果的隨機讀寫操作
像實體中那樣,通過managedQuery方法查詢資料庫并回傳結果,然后利用Cursor對它進行操作
Cursor類的幾個方法:
//回傳給定列名的索引(注意:從0開始的),或者當列名不存在時拋出IlegalArgumentException例外
public abstract int getColumnIndexOrThrow(String columnName);
//移動到第一行.如果Cursor為空,則回傳FALSE
public abstract boolean moveToFirst();
//將游標移動到一個指定的位置,它的范圍為-1<=position<=count
//如果position位置不可達,回傳FALSE
public abstract boolean moveToPosition(int position);
// 根據指定的URI路徑資訊回傳包含特定資料的Cursor物件,應用這個方法可以使Activity接管返回資料物件的生命周期
// 引數-
// URI:Content Provider需要回傳的資源索引
// Projection:用于標識有哪些columns需要包含在回傳資料中
// Selection:作為查詢符合條件的過濾引數,類似于SQL陳述句中Where之后的條件判斷
// SelectionArgs:作為查詢符合條件的過濾引數
// SortOrder:用于對回傳資訊進行排序
// SimpleCursorAdapter:允許系結一個游標的列到ListView上,并使用自定義的layout顯示每個專案
// 創建需要傳入當前的背景關系/一個layout資源,一個游標和兩個陣列
// [一個包含使用的列的名字,另一個(相同大小)陣列包含View中的資源ID,用于顯示相應列的資料值]
public abstract void managedQuery();
用戶可以先編輯短信,然后再去通訊錄中選擇相應的人并發送給他;
用戶可以在短信內容中插入通訊錄中聯系人的號碼
功能實作:
- 創建一個新的Activity選擇(ACTION_PICK)通訊錄中的資料,它會顯示通訊錄中的所有聯系人并讓用戶選擇,然后關閉并回傳一個聯系人的URI給短信程式
- 首先需要添加用于顯示通訊錄的布局檔案,用一個ListView來顯示整個通訊錄,其中用TextView顯示每一記錄,
xml檔案——contact.xml和listitemlayout.xml
最后需要在清單檔案AndroidManifest.xml中注冊通訊錄活動和讀取Contact資料庫的權限:
組態檔奇怪的報錯解決不了
點擊Build->clean Project;
清除所有的類別庫即可,
Executing tasks: [:app:assembleDebug] in project D:\Download\Android\AndroidStudioProjects\MyApplication
> Task :app:preBuild UP-TO-DATE
> Task :app:preDebugBuild UP-TO-DATE
> Task :app:compileDebugAidl NO-SOURCE
> Task :app:compileDebugRenderscript NO-SOURCE
> Task :app:generateDebugBuildConfig UP-TO-DATE
> Task :app:javaPreCompileDebug UP-TO-DATE
> Task :app:checkDebugAarMetadata UP-TO-DATE
> Task :app:generateDebugResValues UP-TO-DATE
> Task :app:generateDebugResources UP-TO-DATE
> Task :app:mergeDebugResources UP-TO-DATE
> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE
> Task :app:extractDeepLinksDebug UP-TO-DATE
> Task :app:processDebugMainManifest
[com.android.support:animated-vector-drawable:28.0.0] C:\Users\gzz\.gradle\caches\transforms-2\files-2.1\2ea246c20a91481cc0f9ad545d596a80\animated-vector-drawable-28.0.0\AndroidManifest.xml Warning:
Package name 'android.support.graphics.drawable' used in: com.android.support:animated-vector-drawable:28.0.0, com.android.support:support-vector-drawable:28.0.0.
> Task :app:processDebugManifest
> Task :app:mergeDebugNativeDebugMetadata NO-SOURCE
> Task :app:mergeDebugShaders UP-TO-DATE
> Task :app:compileDebugShaders NO-SOURCE
> Task :app:generateDebugAssets UP-TO-DATE
> Task :app:mergeDebugAssets UP-TO-DATE
> Task :app:compressDebugAssets UP-TO-DATE
> Task :app:processDebugJavaRes NO-SOURCE
> Task :app:mergeDebugJavaResource UP-TO-DATE
> Task :app:checkDebugDuplicateClasses UP-TO-DATE
> Task :app:desugarDebugFileDependencies UP-TO-DATE
> Task :app:mergeExtDexDebug UP-TO-DATE
> Task :app:mergeDebugJniLibFolders UP-TO-DATE
> Task :app:mergeDebugNativeLibs UP-TO-DATE
> Task :app:stripDebugDebugSymbols NO-SOURCE
> Task :app:validateSigningDebug UP-TO-DATE
> Task :app:writeDebugAppMetadata UP-TO-DATE
> Task :app:writeDebugSigningConfigVersions UP-TO-DATE
> Task :app:processDebugManifestForPackage
> Task :app:processDebugResources
> Task :app:compileDebugJavaWithJavac
?: ?�����?�?�?����?�?�� API��
?: �й���?��?, ��?�� -Xlint:deprecation ���±��?
> Task :app:compileDebugSources
> Task :app:dexBuilderDebug
> Task :app:mergeDexDebug
> Task :app:packageDebug
> Task :app:assembleDebug
BUILD SUCCESSFUL in 7s
27 actionable tasks: 8 executed, 19 up-to-date
Build Analyzer results available
專案投放打開即閃退——
重新clear project,一般運行之前都要先clean;
報錯:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplication, PID: 6652
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapplication/com.example.myapplication.TextMessage}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at com.example.myapplication.TextMessage.onCreate(TextMessage.java:25)
at android.app.Activity.performCreate(Activity.java:8000)
at android.app.Activity.performCreate(Activity.java:7984)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/289326.html
標籤:其他
上一篇:Activity切換效果
下一篇:[iOS開發]ARC
