Android之旅-Intent与Intent Filter[上]

Intent代表了Android应用的启动“意图”,Android应用将会根据Intent来启动指定组件,至于到底启动哪个组件,取决于Intent的各个属性。

一、显式的Intent

明确指定了要启动的组件的Intent我们称为显式的Intent

例如:

  1. package com.example.testintent;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.ComponentName;  
  5. import android.content.Intent;  
  6. import android.os.Bundle;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.Button;  
  10.   
  11. public class MainActivity extends Activity {  
  12.     Button button;  
  13.     @Override  
  14.     protected void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.activity_main);  
  17.         button = (Button)findViewById(R.id.button1);  
  18.         button.setOnClickListener(new OnClickListener() {  
  19.               
  20.             @Override  
  21.             public void onClick(View arg0) {  
  22.                 ComponentName comp = new ComponentName(MainActivity.this, SecondActivity.class);  
  23.                 Intent intent = new Intent();  
  24.                 intent.setComponent(comp);  
  25.                 startActivity(intent);  
  26.             }  
  27.         });  
  28.     }  
  29. }  

 

注意在manifest文件里注册SecondActivity

 

Intent的Componet属性需要接收一个ComponentName对象,ComponetName对象其实是一个指定包和要启动的Activity路径的类,有如下几个构造

  1. componentName(String pkg, String cls)  
  2.   
  3. componentName(Context pkg, String cls)  
  4.   
  5. componentName(Context pkg, Class<?> cls)  

 

componentName(Parcel in)

除了这个属性之外Intent还包含了如下三个方法:

  1. setClass(Context packageContext, Class<?> cls )  
  2.   
  3. setClassName(Context packageContext, String className)  
  4.   
  5. setClassName(String packageName, String className )  

 

上面的代码可以简化为如下代码:

  1. Intent intent = new Intent(MainActivity.this, SecondActivity.class);    
  2. startActivity(intent);    

 

二、隐式的Intent

没有明确指定要启动的组件的Intent我们称为隐式的Intent

Intent除了上面的Componet属性外还有Action、Category属性

Action代表Intent所要完成的一个抽象动作,而Category则是动作附加的类别信息。

例如:

  1. package com.example.testintent;    
  2.     
  3. import android.app.Activity;    
  4. import android.content.ComponentName;    
  5. import android.content.Intent;    
  6. import android.os.Bundle;    
  7. import android.view.View;    
  8. import android.view.View.OnClickListener;    
  9. import android.widget.Button;    
  10.     
  11. public class MainActivity extends Activity {    
  12.     Button button;    
  13.     @Override    
  14.     protected void onCreate(Bundle savedInstanceState) {    
  15.         super.onCreate(savedInstanceState);    
  16.         setContentView(R.layout.activity_main);    
  17.         button = (Button)findViewById(R.id.button1);    
  18.         button.setOnClickListener(new OnClickListener() {    
  19.                 
  20.             @Override    
  21.             public void onClick(View arg0) {    
  22.                 Intent intent = new Intent();    
  23.                 intent.setAction("com.example.intent.action.TEST_ACTION");    
  24.                 startActivity(intent);    
  25.             }    
  26.         });    
  27.     }    
  28. }    

 manifest文件中配置

  1. <activity     
  2.     android:name=".SecondActivity">    
  3.     <intent-filter >    
  4.         <action android:name="com.example.intent.action.TEST_ACTION"/>    
  5.         <category android:name="android.intent.category.DEFAULT"/>    
  6.     </intent-filter>    
  7. </activity>    

 

一个Intent只能指定一个Action属性,可以包含多个Category属性,当程序创建时,默认启动category为DEFAULT的组件。

接下来我们来看看Category属性的用法

  1. public void onClick(View arg0) {    
  2.     Intent intent = new Intent();    
  3.     intent.setAction("com.example.intent.action.TEST_ACTION");    
  4.     intent.addCategory("android.intent.category.TEST_CATEGERY");    
  5.     startActivity(intent);    
  6. }    

 manifest文件中配置

  1. <activity     
  2.     android:name=".SecondActivity">    
  3.     <intent-filter >    
  4.         <action android:name="com.example.intent.action.TEST_ACTION"/>    
  5.         <category android:name="android.intent.category.DEFAULT"/>    
  6.         <category android:name="android.intent.category.TEST_CATEGERY"/>    
  7.     </intent-filter>    
  8. </activity>    

 可以看出其实是根据Action和Category两个属性共同决定启动哪个Activity的,Category可以有多个,只要满足其中的一个即可。

 

实际上Intent不仅可以启动我们定义的Activity,也可以启动系统和其他应用的Activity

这里仅列出部分更多关于Action和Category属性请参阅:http://developer.android.com/reference/android/content/Intent.html

三、一个获取通讯录的实例:

  1. package com.example.testintent;    
  2.     
  3. import android.app.Activity;    
  4. import android.content.Intent;    
  5. import android.database.Cursor;    
  6. import android.net.Uri;    
  7. import android.os.Bundle;    
  8. import android.provider.ContactsContract;    
  9. import android.provider.ContactsContract.Contacts;    
  10. import android.support.v4.content.CursorLoader;    
  11. import android.util.Log;    
  12. import android.view.View;    
  13. import android.view.View.OnClickListener;    
  14. import android.widget.Button;    
  15.     
  16. public class MainActivity extends Activity {    
  17.     private static final String TAG = "MainActivity";    
  18.     Button button;    
  19.     final int PICK_CONTACT = 0;    
  20.     @Override    
  21.     protected void onCreate(Bundle savedInstanceState) {    
  22.         super.onCreate(savedInstanceState);    
  23.         setContentView(R.layout.activity_main);    
  24.         button = (Button)findViewById(R.id.button1);    
  25.         button.setOnClickListener(new OnClickListener() {    
  26.                 
  27.             @Override    
  28.             public void onClick(View arg0) {    
  29.                 Intent intent = new Intent();    
  30.                 intent.setAction(Intent.ACTION_GET_CONTENT);    
  31.                 intent.setType("vnd.android.cursor.item/phone");    
  32.                 startActivityForResult(intent, PICK_CONTACT);    
  33.             }    
  34.         });    
  35.     }    
  36.         
  37.     @Override    
  38.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {    
  39.         super.onActivityResult(requestCode, resultCode, data);    
  40.         switch (requestCode) {    
  41.             case PICK_CONTACT:    
  42.                 if(resultCode == Activity.RESULT_OK){    
  43.                     //获取返回数据    
  44.                     Uri contactData = data.getData();    
  45.                     CursorLoader cursorLoader = new CursorLoader(this, contactData, nullnullnullnull);    
  46.                     Cursor cursor = cursorLoader.loadInBackground();    
  47.                     if(cursor.moveToFirst()){    
  48.                         String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));    
  49.                         String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));    
  50.                         Log.i(TAG, "姓名:" + name);    
  51.                         //根据联系人查看详细信息    
  52.                         Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,     
  53.                                     ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, nullnull);    
  54.                         if(phones.moveToFirst()){     
  55.                             System.out.println("进来了");    
  56.                             String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));    
  57.                             Log.i(TAG, "电话:" + phoneNumber);    
  58.                         }    
  59.                         //关闭游标    
  60.                         phones.close();    
  61.                     }    
  62.                     //关闭游标    
  63.                     cursor.close();    
  64.                 }    
  65.                 break;    
  66.     
  67.         default:    
  68.             break;    
  69.         }    
  70.     }    
  71. }    

 

分类:  android
在使用Python来安装geopandas包时,由于geopandas依赖于几个其他的Python库(如GDAL, Fiona, Pyproj, Shapely等),因此安装过程可能需要一些额外的步骤。以下是一个基本的安装指南,适用于大多数用户: 使用pip安装 确保Python和pip已安装: 首先,确保你的计算机上已安装了Python和pip。pip是Python的包管理工具,用于安装和管理Python包。 安装依赖库: 由于geopandas依赖于GDAL, Fiona, Pyproj, Shapely等库,你可能需要先安装这些库。通常,你可以通过pip直接安装这些库,但有时候可能需要从其他源下载预编译的二进制包(wheel文件),特别是GDAL和Fiona,因为它们可能包含一些系统级的依赖。 bash pip install GDAL Fiona Pyproj Shapely 注意:在某些系统上,直接使用pip安装GDAL和Fiona可能会遇到问题,因为它们需要编译一些C/C++代码。如果遇到问题,你可以考虑使用conda(一个Python包、依赖和环境管理器)来安装这些库,或者从Unofficial Windows Binaries for Python Extension Packages这样的网站下载预编译的wheel文件。 安装geopandas: 在安装了所有依赖库之后,你可以使用pip来安装geopandas。 bash pip install geopandas 使用conda安装 如果你正在使用conda作为你的Python包管理器,那么安装geopandas和它的依赖可能会更简单一些。 创建一个新的conda环境(可选,但推荐): bash conda create -n geoenv python=3.x anaconda conda activate geoenv 其中3.x是你希望使用的Python版本。 安装geopandas: 使用conda-forge频道来安装geopandas,因为它提供了许多地理空间相关的包。 bash conda install -c conda-forge geopandas 这条命令会自动安装geopandas及其所有依赖。 注意事项 如果你在安装过程中遇到任何问题,比如编译错误或依赖问题,请检查你的Python版本和pip/conda的版本是否是最新的,或者尝试在不同的环境中安装。 某些库(如GDAL)可能需要额外的系统级依赖,如地理空间库(如PROJ和GEOS)。这些依赖可能需要单独安装,具体取决于你的操作系统。 如果你在Windows上遇到问题,并且pip安装失败,尝试从Unofficial Windows Binaries for Python Extension Packages网站下载相应的wheel文件,并使用pip进行安装。 脚本示例 虽然你的问题主要是关于如何安装geopandas,但如果你想要一个Python脚本来重命名文件夹下的文件,在原始名字前面加上字符串"geopandas",以下是一个简单的示例: python import os # 指定文件夹路径 folder_path = 'path/to/your/folder' # 遍历文件夹中的文件 for filename in os.listdir(folder_path): # 构造原始文件路径 old_file_path = os.path.join(folder_path, filename) # 构造新文件名 new_filename = 'geopandas_' + filename # 构造新文件路径 new_file_path = os.path.join(folder_path, new_filename) # 重命名文件 os.rename(old_file_path, new_file_path) print(f'Renamed "{filename}" to "{new_filename}"') 请确保将'path/to/your/folder'替换为你想要重命名文件的实际文件夹路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值