手动创建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);
1 直接写入
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;