• 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两个程序,而且修改任何一个程序在退出后,运行任何一个程序得到的结果都是一样的。
    
  • 相关阅读:
    采用泛型链接多类型数据库[含源码]
    .NET 框架中的 Factory 模式
    .NET2.0 框架中的 AbstractFactory 模式
    Microsoft Ajax 脚本浅析
    Refactoring to Patterns 项目实践
    自动校验控件演示[含源码]
    用户定制Asp2.0 WebPart菜单
    设计模式三重天[之二]
    回DUDU关于discuzNT 模版的一些疑惑
    设计模式三重天[之一]
  • 原文地址:https://www.cnblogs.com/comefuture/p/8305939.html
Copyright © 2020-2023  润新知