Android使用Application的好处

如果一个应用程序有2个入口的,1个入口程序打开修改其中的内容,怎么实现另一个入口的数据也修改呢?

下面就用到Application来实现数据的共享,因为一个应用程序只有一个Application,Application还有一个更重要的功能就是数据的初始化

Application的oncreate的函数比activity的函数早执行

 public void onCreate() {
        super.onCreate();
        System.out.println("App oncreate");
    }

下面来看一下如何实现2个应用程序直接的数据共享:

首先MainActivity,把MainActivity的xml文件修改为main1.xml

然后新建第二个Activity,命名为Main2,

然后是布局,main1.xml和main2.xml的布局一样

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Large Text"
        android:id="@+id/textView" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editText" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="保存"
        android:id="@+id/btsave" />
</LinearLayout>

然后新建一个java文件,命名为App,继承自Application

public class App extends Application {
    private String textData="default";
    public String getTextData() {
        return textData;
    }
    public void setTextData(String textData) {
        this.textData = textData;
    }

    //application的oncreate的函数比activity的函数早执行
    @Override
    public void onCreate() {
        super.onCreate();
        System.out.println("App oncreate");
    }

    @Override
    public void onTerminate() {
        super.onTerminate();
    }
    @Override
    public void onLowMemory() {
        super.onLowMemory();
    }
    //内存清理的时候
    @Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);
    }

}

这里需要注意的一点就是我们需要把这个App类注册到AndroidManifest中,只用这样我们才能够实现数据的共享:AndroidManifest中的内容如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yb.DataStorage">

    <application
        android:name="com.example.yb.DataStorage.App"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
      <!--  //会在界面上呈现2个图标,都是程序的入口-->
        <activity
            android:name="com.example.yb.DataStorage.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="com.example.yb.DataStorage.Main2"
            android:label="Main2">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".ServiceActivity"></activity>
    </application>

</manifest>

这个应用程序中,会有2个入口。因为我们在2个activity中,我们都注册了相同的内容:

<intent-filter>
       <action android:name="android.intent.action.MAIN" />

       <category android:name="android.intent.category.LAUNCHER" />
 </intent-filter>

下面是MainActivity的,main2和MainActivity一样,只要改下 setContentView(R.layout.main1);

public class MainActivity extends AppCompatActivity {

    private TextView tv;
    private EditText ed;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        System.out.println("Main1 oncreate");
        setContentView(R.layout.main1);

        tv= (TextView) findViewById(R.id.textView);
        ed= (EditText) findViewById(R.id.editText);

        tv.setText("共享的数据是:"+getApp().getTextData());

        findViewById(R.id.btsave).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ((App)getApplicationContext()).setTextData(ed.getText().toString());
                tv.setText("共享的数据是:"+ed.getText().toString());
            }
        });
    }
    public App getApp(){
        return (App) getApplicationContext();
    }
}

这样就实了2个入口的程序数据共享,~~

原文地址:https://www.cnblogs.com/DonAndy/p/6208853.html