Activity的启动模式
标准模式
在java中
textView.setText(String.format("TaskID:%d,%s",getTaskId(),toString()));
findViewById(R.id.btn_self).setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
startActivity(new Intent(MainActivity.this,MainActivity.class));
}
});
在xml中
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/textview"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btn_self"
android:text="启动自己"
/>
当多次点击启动自己的时候,taskID是不会变的,但是ActivityID是会发生变化的。因为task表示任务栈,栈是先进先出的,程序运行在同一个栈中。当按后退键的时候,就可以重现之前的页面了,这种机制便是使用堆栈实现的。
singeTop
在manifest的activity中设置
android:launchMode="singleTop"
其他代码和上面一样不变,你会发现taskID和ActivityID没有发生变化。
含义:singleTop的作用是如果你有一个Activity在栈顶的话就不会重新创建实例,如果不在还是要创建实例。
这是一个网上的例子:
如果某个Activity的Launch mode设置成singleTop,那么当该Activity位于栈顶的时候,再通过Intent跳转到本身这个Activity,则将不会创建一个新的实例压入栈中。例如:现在栈的情况为:A B C D。D的Launch mode设置成了singleTop,那么在D中启动Intent跳转到D,那么将不会新创建一个D的实例压入栈中,此时栈的情况依然为:A B C D。但是如果此时B的模式也是singleTop,D跳转到B,那么则会新建一个B的实例压入栈中,因为此时B不是位于栈顶,此时栈的情况就变成了:A B C D B。
singleTask
如果存在singleTask的实例,那么当调用singleTask的时候就会适合的销毁singleTask之上的其他所有实例。
singleInstance
每个任务栈只放一个实例。
通过浏览器链接启动本地Activity
manifest的配置文件:
<activity android:name=".Main2Activity">
<intent-filter>
<category android:name="android.intent.category.BROWSABLE"></category>
<category android:name="android.intent.category.DEFAULT"></category>
<action android:name="android.intent.action.VIEW"></action>
<data android:scheme="app"></data>
</intent-filter>
</activity>
PS:category用于隐式启动Intent的时候提供一些额外的信息。
HTML文件:
<a href="app://hello">跳转</a>
然后在模拟器上启动app,在浏览器中设置10.0.2.2(这个是安卓模拟器的调试地址),以及此时在html调试中的端口号和文件路径。比如:10.0.2.2:8020/test/index.html
进入后就是html的页面,通过设置的链接就可以启动Activity了。
Context的理解和使用
作用:访问全局信息的接口:字符串资源之类的资源。比如Activity和Service。
先来一个简单的实例代码,体会一下:
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//我们TextView中需要参数是context,而MainActivity是继承子context的
tv = new TextView(MainActivity.this);
tv.setText("Hello World");
setContentView(tv);
这样新打开的页面就是Hello World了。
PS:在实际的安卓开发的过程中,我们通常不会直接在逻辑里面输入数据,比如上面的setText。通常是逻辑和数据分离,在android中所有的数据都会在string.xml中生成,所以需要建立的数据也最好在那里设置。
<string name="app_name">text</string>
tv.setText(R.string.app_name);`
之后在代码中引用即可:
Application
作用:多个组件之间进行数据的共享。而context可以作为数据共享的桥梁。而Application是一个全局的上下文对象。
Application实现多个程序共享数据
新建一个App继承Application类
public class app extends Application {
private String textData = "default";
public void setTextData(String textData){
this.textData = textData;
}
public String getTextData(){
return textData;
}
}
新建一个Main2继承Activty
public class Main2 extends Activity {
private TextView textView_save;
private EditText editText_save;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);
textView_save = (TextView) findViewById(R.id.textView_save);
editText_save = (EditText) findViewById(R.id.editText_save);
textView_save.setText("共享的数据是:"+ getApp().getTextData());
findViewById(R.id.button_save).setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
((app)getApplicationContext()).setTextData(editText_save.getText().toString());
textView_save.setText("共享的数据是:"+ editText_save.getText().toString());
}
});
}
public app getApp(){
return (app) getApplicationContext();
}
}
修改本来的MainActivity
public class MainActivity extends AppCompatActivity {
private TextView textView_save;
private EditText editText_save;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main1);
textView_save = (TextView) findViewById(R.id.textView_save);
editText_save = (EditText) findViewById(R.id.editText_save);
textView_save.setText("共享的数据是:"+ getApp().getTextData());
findViewById(R.id.button_save).setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
((app)getApplicationContext()).setTextData(editText_save.getText().toString());
textView_save.setText("共享的数据是:"+ editText_save.getText().toString());
}
});
}
public app getApp(){
return (app) getApplicationContext();
}
}
修改Manifast
<application
android:name=".app"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity" android:label="main1">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Main2" android:label="main2">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
添加两个xml,两个Manifast是一样的,命名为main1和main2
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/textView_save"
android:text="New Text"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/editText_save"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/button_save"
android:text="保存"
/>
代码结束,当我们在模拟器上运行程序的时候,会出现main1和main2两个程序,而且修改任何一个程序在退出后,运行任何一个程序得到的结果都是一样的。