如何通过 Parcelable 接口将 WifiP2pManager 对象发送到另一个活动

Posted

技术标签:

【中文标题】如何通过 Parcelable 接口将 WifiP2pManager 对象发送到另一个活动【英文标题】:How to send a WifiP2pManager object though a Parcelable interface to another activity 【发布时间】:2015-05-31 07:36:29 【问题描述】:

正如标题所说,如果可能的话,我如何通过 Parcelable 接口将 WifiP2pManager 和 Channel 对象发送到另一个活动。

我对 java 和 android SDK 不太熟悉,所以示例代码很有帮助。

谢谢。

【问题讨论】:

向我们展示您已经尝试过的代码。 我没有任何工作代码。我不知道该怎么做。我们知道我们可以通过 intent.putExtra() 发送普通数据类型,但这是 WifiP2pManager,我不知道该怎么做。 【参考方案1】:

如果您确实需要与活动共享 p2p 管理器和频道的实例,我真的建议您考虑更好的方法来完成任务,而不是简单地发送它。

完成它的一种方法是在其他类中实现可用于所有活动的共享部分,例如简单地创建扩展应用程序的新类。在其中实现 WifiP2pManager 和 Channel 处理,将其标记为清单中的应用程序。

然后在活动中使用 getApplicationContext() 并将其转换为您的类并使用任何公共函数来获取 WifiP2pManager 和 Channel 对象。

【讨论】:

【参考方案2】:

在发现无法通过 Intent 发送此类对象后,我尝试在我的 Activity 之间共享数据,因此我的 MainHomeActivity 中诞生了静态 SharedData 类。

public static class SharedData

    private static WifiP2pManager mManager;
    private static WifiP2pManager.Channel mChannel;

    static public void set(WifiP2pManager m, WifiP2pManager.Channel c)
    
        mManager = m;
        mChannel = c;
    

    static public WifiP2pManager getManager()
    
        return mManager;
    

    static public WifiP2pManager.Channel getChannel()
    
        return mChannel;
    

并按如下方式使用, 通话活动,

Intent intent = new Intent(view.getContext(), Message.class);
SharedData.set(mManager, mChannel);
startActivity(intent);

在被调用的活动中,

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    //...
    Intent intent = getIntent();
    mManager = new ManetsManager(MainHomeActivity.SharedData.getManager(), MainHomeActivity.SharedData.getChannel());
    //...

我不知道这在多大程度上是正确的,但它在我的情况下有效。 希望这对某些人有所帮助。 感谢您的回答@Dr.Jukka

【讨论】:

【参考方案3】:

创建静态 Wifip2pmanager 对象并初始化管理器

public class secondActivity extends AppCompatActivity 
WifiP2pManager mManager;
WifiP2pManager.Channel mChannel;
public static WifiP2pManager sharedManager;
public static WifiP2pManager.Channel sharedChannel;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);

    mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
    mChannel = mManager.initialize(this, getMainLooper(), null);
    sharedManager=mManager;
    sharedChannel=mChannel;
 

在另一个活动中调用该静态对象

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_chat);
    WifiP2pManager manager=secondActivity.sharedManager;
    WifiP2pManager.Channel channel=secondActivity.sharedChannel;
  

【讨论】:

以上是关于如何通过 Parcelable 接口将 WifiP2pManager 对象发送到另一个活动的主要内容,如果未能解决你的问题,请参考以下文章

Android :安卓学习笔记之 通过Intent传递类对象(实现Serializable和Parcelable接口)

使用 Parcelable 接口时如何序列化空值

Parcelable接口

替换 Parcelable 接口的最佳实践

Serializable 和 Parcelable

Android:使用Parcelable接口在跳转Activity时传递数据以及错误信息 Parcel: unable to marshal value 的解决