android学习笔记(5)

手动创建activity ,显示Intent和隐式Intent的使用  context的作用,  application的相关使用

手动创建activity


先分别创建一个java class和layout resource file

在main2中

package com.example.lenovo.intent;

import android.app.Activity;
import android.os.Bundle;

/**
 * Created by lenovo on 2017/4/18.
 */

public class Main2 extends Activity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main2);
    }
}
记得继承activity,后续代码可以根据自动提醒得出,只用打onCr 剩下的都能出来

然后绑定xml文件,

在xml文件中加一个textview好用来识别


如果直接运行会发现错误。。。

因为配置文件不会自动给你配置,所以要在这里面手动设置


添加这一句

<activity android:name=".Main2"></activity>
 
然后可以正常运行
 


<activity android:name=".Main2"></activity>里面.Main2是com.example.lenovo.intent.Main2的缩写


显示Intent和隐式Intent的使用
我们常使用的是显示Intent,如果要使用隐式Intent,要先进行配置
<activity android:name=".Main2">
    <intent-filter>
        <category android:name="android.intent.category.DEFAULT"/>
        <action android:name="liyan"/>
    </intent-filter>
</activity>
category是默认的,cation的name是用来识别的,理论上用什么都可以
然后可以直接使用
startActivity(new Intent("liyan") );
但是一般有个约定熟成的命名方法
com.example.lenovo.intent.action.Main2  包名加action加类名
为了防止错误,一般在类内部定义一个String
public class Main2 extends Activity{
    public static final String ACTION="com.example.lenovo.intent.action.Main2";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main2);
    }
}
然后可以直接调用,防止错误
startActivity(new Intent(Main2.ACTION) );
结果和之前一样
 
然后试试不同包直接的跳转

然后不断next,把名字改为app2

其实从两个包里面的类可以相同就可以看出,不能用显示Intent直接跳转到另一应用的activity
 
调整代码
startActivity(new Intent("android.intent.action.MAIN") );
由于系统会自动命名,所以如果按照系统命名打开会有很多提醒


最好还是根据命名规则自己修改

然后就到了最难受的了。。。

我从app2到app没问题,但是反过来却不行。。

经过各种修改,实在找不到解决办法,重启了下android studio 就好了

然后自信想了半天,发现问题所在

由于两个是相互映射,我不断打开两个应用,导致出错了,所以有时候做完测试记得关掉应用

<activity android:name=".Main2Activity"
    android:exported="false"
    >
    <intent-filter>
        <category android:name="android.intent.category.DEFAULT"/>
        <action android:name="com.example.app2.action.Main2Activity"/>
    </intent-filter>
</activity>
可以设置
android:exported="false",这个值默认是true

为了测试可以加一个try catch,用弹窗的方法来提醒

try {
    startActivity(new Intent("com.example.app2.action.Main2Activity") );
}catch (Exception e){
    Toast.makeText(MainActivity.this,"无法启动",Toast.LENGTH_SHORT).show();
}

如果设置了两个相同的action,那么就会弹出一个提示,让你选择要进的应用

intent-filter中还有各种属性
比如data属性
<data android:scheme="data"/>

再创一个activity,再次跳转

用data属性就可以进行唯一识别

startActivity(new Intent("com.example.app2.action.Main2Activity",Uri.parse("app2://hello")) );
这样就会直接跳转到目的activity,记得在测试前运行一下,将其安装进模拟器


context的作用

当我们访问当前应用的资源,启动一个新的activity的时候都需要提供Context。

Context是一个抽象基类,我们通过它访问当前包的资源(getResources、getAssets)和启动其他组件(Activity、Service、Broadcast)以及得到各种服务(getSystemService),当然,通过Context能得到的不仅仅只有上述这些内容。对Context的理解可以来说:Context提供了一个应用的运行环境,在Context的大环境里,应用才可以访问资源,才能完成和其他组件、服务的交互,Context定义了一套基本的功能接口,可以理解为一套规范,而Activity和Service是实现这套规范的子类,这么说也许并不准确,因为这套规范实际是被ContextImpl类统一实现的,Activity和Service只是继承并有选择性地重写了某些规范的实现。

我们常用的setContentView();,一般是使用它和activity进行绑定,但是也可以和控件直接绑定

创定义一个TextView后创建实例

textView=new TextView(MainActivity.this);

直接写入
textView.setText("liyan");

2 用资源调用
在res中value,可以找到很多资源
textView.setText(R.string.app_name);
 setContentView(textView);
也可以通过资源文件输出
 System.out.println(getResources().getText(R.string.app_name));*/

图片文件也是同理

imageView=new ImageView(this);
imageView.setImageResource(R.mipmap.ic_launcher);
setContentView(imageView);


Application

有时候我们要在多个组件间进行数据共享,application做为一个全局上下文对象

比如新建一个java class

package com.example.lenovo.application;

import android.app.Application;

/**
 * Created by lenovo on 2017/4/19.
 */

public class app extends Application {
}
让他继承application,然后在配置文件中配置

<application
    android:name=".app"
我们先在app中定义一个数据,并为他写好发送接收函数

private String text="default";

public String getText() {
    return text;
}

public void setText(String text) {
    this.text = text;
}
再写一个java class main2,

同时将他也设为启动项,然后定义好onCreat函数,设置布局


新建main2布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.example.lenovo.application.MainActivity">

    <TextView
       android:id="@+id/tv"
android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="textPersonName" android:text="Name" android:ems="10" android:id="@+id/editText" /> <Button android:text="Button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button" /></LinearLayout>
两个布局相同


java文件也一样

package com.example.lenovo.application;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private TextView textView;
    private EditText editText;
    @Override

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView=(TextView)findViewById(R.id.tv);
        editText= (EditText) findViewById(R.id.editText);
        textView.setText("共享的数据为:"+((app) getApplicationContext()).getText().toString());
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((app)getApplicationContext()).setText(editText.getText().toString());
                textView.setText("共享的数据为:"+((app) getApplicationContext()).getText().toString());
            }
        });
       /* textView=new TextView(MainActivity.this);
        imageView=new ImageView(this);
        imageView.setImageResource(R.mipmap.ic_launcher);
        setContentView(imageView);*/
       //textView.setText("liyan");
       /* textView.setText(R.string.app_name);
        setContentView(textView);
        System.out.println(getResources().getText(R.string.app_name));*/
    }
}
我新建了一个
<TextView

    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello World111!" />
用来区分一和二
 
当你开始运行时会发现

会自动生成两个入口


点击button

点击后退键之后,点开一,会发现数据已经变化了

这样就完成了全局数据的共享
 
application优先于大部分内容,所以有时候也用来做初始化
可以重置构造函数可以试试,发现他始终优先于activity的onCreat;
 
 
 
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值