intent 组件

来源:互联网 发布:淘宝联盟怎么赚不到钱 编辑:程序博客网 时间:2024/06/10 11:46

Intent(意图)主要是解决Android应用的各项组件之间的通讯。也可以应用与程序内部,activityservicebroadcast receiver 之间交互

listActivity需要构造一个 Intent,这个Intent用于告诉系统,我们要做“查看”动作,此动作对应的查看对象是“某联系人”,然后调用startActivity (Intent intent),将构造的Intent传入,系统会根据此Intent中的描述,到ManiFest中找到满足此Intent要求的Activity,系统会调用找到的 Activity,即为detailActivity,最终传入Intent,detailActivity则会根据此Intent中的描述,执行相应的操作。


intent 相关属性方法

1.component(组件):目的组件

2.action(动作):需要表现的意图的行动

3.category(类别): 用来表现动作的类别

4.data(数据):表示与动作action需要操作的数据

5.type(数据类型):对于data范例的描写

6.extras(扩展信息):扩展信息

7.flags(标志位):期望这个意图的运行模式




1.

OtherActivity.java

自定义action标记,命名规范:包名+action

public static final String MY_ACTION = "com.android4_4.action.MY_ACTION "

2. 自定义activity组件式,必须添加一个默认类别category 

    多个activity有相同action标记,弹出列表让用户自行选择


AndroidManifest.xml

 <activity
            android:name=".IntentMainActivity"
            android:label="@string/app_name" >
            <intent-filter>
             
  <action android:name="com.android4_4.action.MY_ACTION" />
                <category android:name="android.intent.category.DEFAULT" />

            </intent-filter>
        </activity>

3.MainActivity.java

Intent intent = new Intent();

intent.setAction(OtherActivity.MY_ACTION);

startAction(intent);

Category(类别):用来表现动作的类型,也作为<intent-filter>子元素声明,一般配合action(动作)

category 可以有多个,满足条件必须是全部category 匹配,action 只能有一个

<category android:name="com.android4_4.action.MY_CATEGORY ">

<category android:name="com.android4_4.action.MY_CATEGORY_2 ">

//调用方法 mIntent.addCategory(category)

Data(数据):表示与动作action需要操作的数据

Uri data=Uri.parse("www.baidu.com");

intent.setAction(Intent.ACTION_VIEW);

//调用方法ntent.setData(data);

默认浏览器被匹配 action+data  ;Intent.ACTION_CALL  打电话 等等。。。

intent  data+type属性说明

type表示数据类型或者MIME类型 如(text/html,text/xml.image/jpg ...)

Intent intent = new Intent();

intent.setAction(Intent.ACTION_VIEW);

Uri data = Uri.parse("file///sdcard/xpg.mp3");

//Uri data = Uri.parse("/sdcard/xpg.mp3"); 也可以这样写

intent.setData();

intent.setType();

intent.setDataAndType(data,"audio/mp3"); //数据  ,数据类型

//setData(),setType(),只允许单独设置一个,每个方法里都把另一个方法属性置空

系统根据类型匹配 播放xpg.mp3



7.flags 标志位 :期望这个意图的运行模式

1.

一个程序启动后系统为这个程序分配一个task使用,一个task可以有多个activity,

同一个程序也可以拥有多个task,涉及到加载activity的四种模式, standard,singleTop, singleTask,singleInstance

在AndroidManifest.xml中设置activity标签属性launchMode中设置该activity的加载模式

2.

Intent intent=new Intent(this,OtherActivity.class);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//相当于在配置文件中:singleTask

 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)//singleTop;

startActivity(intent);


栈结构

standard:默认模式,每次启动都会创建一个新的activity实例,放到目标task任务栈顶端

singleTop:判断当前任务栈顶是否存在相同的activity,如果存在,就不创建新的activity实例

singleTask:在任务栈中判断是否有相同的activity,如果存在,清楚该activity之上的其他activity并显示本activity(该activity此时在栈顶)

singleInstance:单实例任务,在一个新的task任务栈中创建activity实例,并且该task只允许存在该activity一个对象,在此调用该activity之间使用该activity对象,并不从新创建新的activity


public class MainActivity extends Activity {private Button smsbut,intentbut;private EditText edit;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.linear);        smsbut = (Button) findViewById(R.id.smsButton);        intentbut = (Button) findViewById(id.intentBut);        edit = (EditText) findViewById(id.edit);    }    public void  Butlistener(View v){    //数据get提交到服务器    AsyncHttpClient client = new AsyncHttpClient();    client.get("www.baidu.com", new AsyncHttpResponseHandler() {@Overridepublic void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {Toast.makeText(getApplicationContext(), "登陆成功", 0).show();}@Overridepublic void onFailure(int statusCode, Header[] headers,byte[] responseBody, Throwable error) {Toast.makeText(getApplicationContext(), "登陆失败", 0).show();}});        }    public void PostBut(View v){    //数据post提交到服务器    AsyncHttpClient client = new AsyncHttpClient();    String url ="www.baidu.com";    RequestParams params = new RequestParams();     params.put("username", "james");     params.put("password", "123456");client.post(url, params, new AsyncHttpResponseHandler() {@Overridepublic void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {Toast.makeText(getApplicationContext(), "登陆成功", 0).show();}@Overridepublic void onFailure(int statusCode, Header[] headers,byte[] responseBody, Throwable error) {Toast.makeText(getApplicationContext(), "登陆失败", 0).show();}});        }    //intent 启动  短信activity    public void smsButlistener(View v){    Intent intent = new Intent();    //设置意图对象    intent.setAction("android.intent.action.SENDTO");    intent.addCategory("android.intent.category.DEFAULT");    intent.setData(Uri.parse("sms:1864748483"));    startActivity(intent);//启动activity        }    //显示意图向其他activity 发送数据    public void otherActivityButlistener(View v){    Intent intent = new Intent(this,OtherActivity.class);    intent.putExtra("name", edit.getText().toString());//put 数据 支持java8大类型    startActivity(intent);//启动activity        }    }
OtherActivity.java

public class OtherActivity extends Activity {TextView textView;ProgressBar progressBar2;//进度条@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_other);textView = (TextView) findViewById(id.textView);progressBar2 = (ProgressBar) findViewById(id.progressBar2);Intent intent = getIntent();String name = intent.getStringExtra("name");Random random = new Random();int rp = random.nextInt(100);textView.setText(name+"  人品值:"+rp);progressBar2.setMax(100);progressBar2.setProgress(rp);//设置progress bar}}








0 0
原创粉丝点击