Android:在活动之间传递数据

时间:2015-08-04 07:14:47

标签: android android-activity android-studio bluetooth

我有两个活动的应用程序。第一个(蓝牙活动)是搜索蓝牙设备并与它们连接(工作正常)。第二个(控制活动)有一个控制按钮。每个按钮都假设通过蓝牙发送命令。

问题是: 1.当我使用Intent时,它会从" Control Activity"中传递日期。到"蓝牙活动",还要将视图更改为"蓝牙活动"我不想要的。

2.如果我使用" intent.putExtra"我在"控制活动"中有多个命令?它需要插入一个KEY。如何找到发送的密钥。

"控制活动"

Intent intent = new Intent(this,Bluetooth.class);
    intent.putExtra("blue", "b");
    startActivity(intent);

"蓝牙活动"

getIntent().getExtras().getString("blue")

6 个答案:

答案 0 :(得分:1)

您可以在Bluetooth Activity类中定义常量,例如:

public static final String EXTRA_KEY_BLUE = "blue";

然后你有一个这个常量的定义,所以你可以在每个类中使用它,例如:

Intent intent = new Intent(this,Bluetooth.class);
intent.putExtra(Bluetooth.EXTRA_KEY_BLUE, "b");
startActivity(intent);

在蓝牙活动中,您可以检查捆绑包是否包含特定密钥。

答案 1 :(得分:1)

您也可以使用共享偏好设置

Android Shared Preferences

答案 2 :(得分:1)

创建意图传递类名称或intnet操作名称

Intent intent = new Intent(this,Bluetooth.class);
     // put key/value data
    intent.putExtra("message", "Hello From Your Class");
     //  or you can add data to a bundle
    Bundle extras = new Bundle();
    extras.putString("status", "Data Received!");
     //  add bundle to intent
    intent.putExtras(extras);
     //  start the activity
    startActivity(intent);

我们可以使用getIntent()获取对发送的意图的引用来访问发送的数据; 在这里,我们可以提取已发送的消息getIntent().getStringExtra(“message”) 此外,我们可以访问附加的包getIntent().getExtras(),然后我们可以从包中提取数据。

 @Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_layout);

    // 1. get passed intent 
    Intent intent = getIntent();

    // 2. get message value from intent
    String message = intent.getStringExtra("message");

    // 3. show message on textView 
    ((TextView)findViewById(R.id.tvMessage)).setText(message);

    // 4. get bundle from intent
    Bundle bundle = intent.getExtras();

    // 5. get status value from bundle
    String status = bundle.getString("status");

    // 6. show status on Toast
    Toast toast = Toast.makeText(this, status, Toast.LENGTH_LONG);
    toast.show();
}

Reference

良好做法

如果您要保存的关键值集合相对较少,则应使用SharedPreferences Demo

答案 3 :(得分:0)

  

但也将视图更改为“我不想要的蓝牙活动”

如果你不想开始一项活动,你将不得不做其他的事情,比如使用一个非活动的类,它可能适合像蓝牙这样的东西有一个单身:

public enum Bluetooth {
    INSTANCE;

    //methods
}

除此之外,我在开始时传递给活动的一般方式是我倾向于定义一个私有常量,并将两个代码段放在同一个类中:

public class Bluetooth extends Activity {

   private static final String EXTRA_KEY_BLUE = "blue";

   public static Intent createIntent(String blue) {
       Intent intent = new Intent(this,Bluetooth.class);
       intent.putExtra(EXTRA_KEY_BLUE, "b");
       return intent;
   }

   @Override
   public void onCreate(Bundle savedInstanceState){
       super.onCreate(...)
       String blue = getIntent().getExtras().getString(EXTRA_KEY_BLUE);

   }

}

控制活动(没有提及键,因此它是强类型的):

Intent intent = Bluetooth.createIntent("b");
startActivity(intent);

答案 4 :(得分:0)

<蓝牙活动中的

Bundle bundle = getIntent().getExtras();
if (bundle != null) {
    Set<String> keys = bundle.keySet();
    Iterator<String> it = keys.iterator();

    while (it.hasNext()) {
        String key = it.next();                        //your key
        bundle.get(key);                               //your value
    }
}

答案 5 :(得分:0)

Intent用于从Activity更改为other。如果您只想使用蓝牙的某些功能,最好在BluetoothActivity中定义一个方法并直接从ControlActivity中调用它,但不要将视图更改为BluetoothActivity。

在“BluetoothActivity”中

public static void action(String str) {
    //Some actions

}

在“ControlActivity”中

BluetoothActivity.action("blue")

另一种方法是,如果你不想使用静态方法,你也可以从ControlActivity保留BluetoohActivity的引用,然后定义以前的方法而不是静态方法,并从这个引用中调用它。