android学习笔记(二)

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

posted on 2017-09-27 15:14  码的艺术家  阅读(203)  评论(0编辑  收藏  举报

导航