android学习笔记(二)

来源:互联网 发布:12315可以投诉淘宝官方 编辑:程序博客网 时间:2024/06/05 15:22

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两个程序,而且修改任何一个程序在退出后,运行任何一个程序得到的结果都是一样的。
原创粉丝点击