A. 如何android多Activity间共享数据
方法1:在某个Activity中声明一个公共的static变量把共享数据作为静态变量 1 2 3 4 5 6 7 8 9 10 public class OneActivity extends Activity { public static Data data = null;//声明的变量 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); data = new Data(); } } public class TwoActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Data data = OneActivity.data; } 但是这样会增加activity之间的耦合度,不是很好 方法二:把共享数据作为放在Applicaiton中 定义一个MyApplication继承于Application public class MyApplication extends Application{ private Data data; @Override public void onCreate() { super.onCreate(); data = new Data(); } public Data getData(){ return data; } public void setData(Data data){ this.data = data; } } 将MyApplication配置到清单文件中作为程序启动的ApplicationContext 设置Application的name属性即可 在Activity中获取数据 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyApplication application = (MyApplication) getApplication(); Data data = application.getData(); } }
B. 如何android多Activity间共享数据
其实有如下5种方式:
1.基于消息的通信机制 Intent ---boudle ,extra
数据类型有限,比如遇到不可序列化的数据Bitmap,InputStream, 或者LinkList链表等等数据类型就不太好用。
2. 利用static静态数据,public static成员变量;
3.基于外部存储的传输, File/Preference/ Sqlite ,如果要针对第三方应用需要Content Provider
4.基于IPC的通信机制context 与Service之间的传输,如Activity与Service之间的通信,定义AIDL接口文件。
5. 基于Application Context
这里面我觉得第五种方法更具普适性,在网上找了篇讲解得好的文章,原文如下:
在Android中使用Intent在两个Activity间传递数据时,只能是基本类型数据,或者是序列化对象。Intent是一种基于消息的进程内和进程间通信模型,当我们需要在我们应用程序内部,多个Activity间进行复杂数据对象共享交互时,使用Intent就显得很不方便。此时,我们就需要一种数据共享的机制来实现。当然,直接使用java语言中的静态变量是可以的,但在Android中有更为优雅的实现方式。
The more general problem you are encountering is how to save stateacross several Activities and all parts of your application. A staticvariable (for instance, a singleton) is a common Java way of achievingthis. I have found however, that a more elegant way in Android is toassociate your state with the Application context.
--如想在整个应用中使用,在java中一般是使用静态变量,而在android中有个更优雅的方式是使用Application context。
As you know, each Activity is also a Context, which is informationabout its execution environment in the broadest sense. Your applicationalso has a context, and Android guarantees that it will exist as asingle instance across your application.
--每个Activity 都是Context,其包含了其运行时的一些状态,android保证了其是single instance的。
The way to do this is to create your own subclass of android.app.Application,and then specify that class in the application tag in your manifest.Now Android will automatically create an instance of that class andmake it available for your entire application. You can access it fromany context using the Context.getApplicationContext() method (Activityalso provides a method getApplication() which has the exact sameeffect):
--方法是创建一个属于你自己的android.app.Application的子类,然后在manifest中申明一下这个类,这是android就为此建立一个全局可用的实例,你可以在其他任何地方使用Context.getApplicationContext()方法获取这个实例,进而获取其中的状态(变量)。
class MyApp extends Application { private String myState; public String getState(){ return myState; } public void setState(String s){ myState = s; } } class Blah extends Activity { @Override public void onCreate(Bundle b){ ... MyApp appState = ((MyApp)getApplicationContext()); String state = appState.getState(); ... } }
对于Application的生命周期,今天测试了一下,Application类型在该APP被install的时候就已经实例化了,并且onCreate也已经被调用了。
如果需要创建类型里面可能需要用到的对象的话,就可以在构造函数里面实现,但是如果需要将该类型bind Service或者registerReceiver等操作时,需要将这些操作放到onCreate中,否则会抛出异常。其原因主要是这个对象还没有创建完成,此时你用这个对象来bindservice必然会出现意想不到的情况,所以在使用时还需要注意。
C. 如何android多Activity间共享数据
1、在某个Activity中声明一个公共的static变量把共享数据作为静态变量,但是这样会增加activity之间的耦合度,不是很好。
2、把共享数据作为放在Applicaiton中。定义一个MyApplication继承于Application,将MyApplication配置到清单文件中作为程序启动的ApplicationContext,设置Application的name属性即可。
D. 如何android多Activity间共享数据
方法1:在某个Activity中声明一个公共的static变量把共享数据作为静态变量
1
2
3
4
5
6
7
8
9
10
public class OneActivity extends Activity {
public static Data data = null;//声明的变量
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
data = new Data();
}
}
1
2
3
4
5
6
7
public class TwoActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Data data = OneActivity.data;
}
但是这样会增加activity之间的耦合度,不是很好
方法二:把共享数据作为放在Applicaiton中
E. 如何android多Activity间共享数据
通过Application Context进行变量共享 首先,建立一个继承自Application的类,将要共享的变量在其中声明: 代码: import android.app.Application; public class ApplicationTrans extends Application { private String value; public String getValue() { return value; } public void setValue(String value) { this.value = value; } } 注意:需要注意的是,写完这个类之后需要在AndroidManifest.xml中在Application节点中进行设置 <application android:name=".ApplicationTrans"//必须设置 android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".TwoActivityShareDataActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".SecondActivity" > </activity> </application> 接下来在MainActivity中进行操作: ((ApplicationTrans) getApplication()).setValue("我是通过Application传递的值");//赋值操作 在第二个Activity中获得该值:就行用这个值进行操作了 ((ApplicationTrans) getApplication()).getValue();
F. 如何android多Activity间共享数据
在Application里面加个静态列表, 把多个activity界面的数据放到里面就可以了.
G. 如何android多Activity间共享数据
通过Application Context进行变量共享
首先,建立一个继承自Application的类,将要共享的变量在其中声明:
代码:
import android.app.Application;
public class ApplicationTrans extends Application {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
注意:需要注意的是,写完这个类之后需要在AndroidManifest.xml中在Application节点中进行设置
<application
android:name=".ApplicationTrans"//必须设置
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".TwoActivityShareDataActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity" >
</activity>
</application>
接下来在MainActivity中进行操作:
((ApplicationTrans) getApplication()).setValue("我是通过Application传递的值");//赋值操作
在第二个Activity中获得该值:就行用这个值进行操作了
((ApplicationTrans) getApplication()).getValue();
H. Android 多个Activity 共用一个socket
想要让多个activity共用一个socket(本文使用bluetoothsocket,TCP通信其实也是一样的,只是socket引入的库不同而已),网上三个方法,这里只是实现了比较简单的一种(application实体类)。
第一步实现socket实体类:
第二步:设置AndroidManifest.xml
加入android:name=".Mysocket"
第三步:在第一次创建链接时对它初始化:
因为我是蓝牙与51单片机进行通信,初始化bluetoothsocket后,再使用((Mysocket)getApplication()).setSocket(socket8051);这句话初始化实体类。
第四步:在其他的activity调用这个socket可以使用
不出意外可以正常运行。
实体类
`hello`
I. 如何android多Activity间共享数据
共享数据应该从整个框架设计上开始修改而不是专注从功能实现的角度上出发
1.制作一个独立的静态类,用于存储数据(详细参考单例模式)
2.Activity本身并不再保存相关数
3.Activity通过静态类获取数据的引用并显示相关内容
另外可能出现的问题
当多个Activity间需要传递参数时,可以通过EventBus进行传递
当数据改变时 发出改变消息,各Activity均是通过监听消息改变更新界面(详细可网络观察者模式)
详细框架设计可以参考一些很传统的框架,比如mvc之类的框架,相关文档具体可以在网络里查询