gpt4 book ai didi

java - 如何从绑定(bind)到 Android 父 Activity 的 fragment 访问服务功能?

转载 作者:太空宇宙 更新时间:2023-11-03 13:13:18 26 4
gpt4 key购买 nike

我有一个带有 viewpager fragment 的 Android Activity 。在 Activity 的 onCreate 方法中,我将一个服务绑定(bind)到它,该服务在后台不断运行。

在 fragment 中,在特定条件下,我需要调用服务中处理该条件的函数。访问服务和调用其功能的正确方法是什么?

主 Activity .java

public class MainActivity extends AppCompatActivity {

private String TAG = "MainActivity";

DbHelper dbHelper;
SessionManager sessionManager;
SessionCache sessionCache;
Map<String, ?> userDetails;
protected SocketListener socketService;

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


sessionManager = new SessionManager(getApplicationContext());

// Connect to background socketlistener service
Intent serviceIntent = new Intent(MainActivity.this, SocketListener.class);
startService(serviceIntent);
.
.
.

TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
tabLayout.addTab(tabLayout.newTab().setText("").setIcon(getResources().getDrawable(R.drawable.profileicon)));
tabLayout.addTab(tabLayout.newTab().setText("").setIcon(getResources().getDrawable(R.drawable.homeicon)));
tabLayout.addTab(tabLayout.newTab().setText("").setIcon(getResources().getDrawable(R.drawable.chaticon)));

tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
final NonSwipeableViewPager viewPager = (NonSwipeableViewPager) findViewById(R.id.view_pager);

final CustomPagerAdapter pagerAdapter = new CustomPagerAdapter
(getSupportFragmentManager(), tabLayout.getTabCount());

viewPager.setAdapter(pagerAdapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

viewPager.setCurrentItem(1);
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
}

@Override
public void onTabUnselected(TabLayout.Tab tab) {

}

@Override
public void onTabReselected(TabLayout.Tab tab) {

}
});
}

private ServiceConnection serviceConnection = new ServiceConnection() {


@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
socketService = ((SocketListener.LocalBinder) iBinder).getService();
}

@Override
public void onServiceDisconnected(ComponentName componentName) {
socketService = null;
}
};

}

这是我的服务。我连接到服务器,并不断监听更新。

套接字监听器.java

    package com.example.gopa2000.mobapps;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

import java.net.URISyntaxException;

import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;

public class SocketListener extends Service {

private static String TAG = "SocketListener";
private Socket socket;

public SocketListener() { }

@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return localBinder;
}

private final IBinder localBinder = new LocalBinder();
public class LocalBinder extends Binder {
public SocketListener getService(){
Log.i(TAG, "getService: Sitting in local binder.");
return SocketListener.this;
}

public void sendMessage(String message){
socket.emit("match", message);
}
}

@Override
public void onCreate() {
super.onCreate();
}

public void isBoundable(){
Log.i(TAG, "Bind like a baller.");
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);

Runnable connect = new ConnectSocket();
new Thread(connect).start();
return START_STICKY;
}

class ConnectSocket implements Runnable {
@Override
public void run() {
try {
socket = IO.socket(RESTClient.getURL());

socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
@Override
public void call(Object... args) {
Log.i(TAG, "call: Connected to backend!");
}
});

socket.connect();
} catch (URISyntaxException e){
Log.e(TAG, "run: ", e);
}
}
}

public Socket getSocket(){
return this.socket;
}
}

这是我需要调用 sendMessage(string) 的 fragment 。

public class MainViewFragment extends Fragment {

private final String TAG = "MVFragment";

private RecyclerView recyclerView;
private RecyclerView.LayoutManager layoutManager;
private RecyclerView.Adapter adapter;
private SessionManager sessionManager;
private ArrayList<CustomCard> cards;
private CardAdapter cardAdapter;
private Button btn;
private SwipeFlingAdapterView flingContainer;
private Map<String, ?> userDetails;
// hax
private static String userEmail;



@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.from(getContext()).inflate(R.layout.fragment_main_view, container, false);

.
.

flingContainer.setAdapter(adapter);

flingContainer.setFlingListener(new SwipeFlingAdapterView.onFlingListener(){
.
.

@Override
public void onRightCardExit(Object o) {
.
.

if(match){

// need to call sendMessage from the service here. <------------------------

sessionCache.addToMatchTable(Liker, Likee);
}
}

@Override
public void onAdapterAboutToEmpty(int i) {

}

@Override
public void onScroll(float v) {

}
});


flingContainer.setOnItemClickListener(new SwipeFlingAdapterView.OnItemClickListener(){
@Override
public void onItemClicked(int itemPosition, Object dataObject){
Toast.makeText(getActivity(), "Clicked!", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(getActivity().getApplicationContext(), FullScreenCardLayout.class);
startActivity(intent);
}
});

return view;
}

最佳答案

首先 sendMessage(message) 方法应该在服务内部而不是 LocalBinder

public class SocketListener extends Service {

public void sendMessage(String message){
socket.emit("match", message);
}
}

其次要从 fragment 访问 Activity 方法,您应该在 fragment 内创建接口(interface)

interface MessageSender {
void sendMessage(String message);
}

然后在你的 Activity 中实现它

public class MainActivity extends AppCompatActivity implements MessageSender {

@Override
public void sendMessage(String message) {
// call the service here
socketService.sendMessage(message);
}
}

在您的 fragment 中,实现onAttach() 并初始化接口(interface)实例

public class MainViewFragment extends Fragment {
private MessageSender mMessageSenderCallback;

@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
mMessageSenderCallback = (MessageSender) context;
} catch (ClassCastException e) {
// Error, class doesn't implement the interface
}
}

@Override
public void onDetach() {
super.onDetach();
// Remove activity reference
mMessageSenderCallback = null;
}
}

要发送消息,请调用 mMessageSenderCallback.sendMessage(message) 并将您的消息放入 fragment 中。

关于java - 如何从绑定(bind)到 Android 父 Activity 的 fragment 访问服务功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40750712/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com