Обновить основную активность, когда моя служба привязок меняет свое состояние
Мне нужно обновить Main Activity
когда мой Bind Service
меняет свое состояние. Код для моего MainActivity
:
public class MainActivity extends AppCompatActivity
implements UDPService.OnHeadlineSelectedListener{
protected void onStart() {
super.onStart();
Intent intent = new Intent(this, UDPService.class);
bindService(intent, myConnection, Context.BIND_AUTO_CREATE);
//startService(intent);
}
private ServiceConnection myConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
// This is called when the connection with the service has been
// established, giving us the object we can use to
// interact with the service. We are communicating with the
// service using a Messenger, so here we get a client-side
// representation of that from the raw IBinder object.
UDPService.MyLocalBinder binder = (UDPService.MyLocalBinder) service;
myService = binder.getService();
}
public void onServiceDisconnected(ComponentName className) {
// This is called when the connection with the service has been
// unexpectedly disconnected -- that is, its process crashed.
myService = null;
}
};
protected void onCreate(Bundle savedInstanceState) {
... //In this part i have initialized BaseAdaptater
}
public static Context getContextOfApplication() {
return contextOfApplication;
}
@Override
public void onArticleSelected(int position) {
baseAdapter.notifyDataSetChanged();
}
}
Пока услуга есть:
public class UDPService extends Service {
private final IBinder myBinder = new MyLocalBinder();
LampManager lm = LampManager.getInstance();
int port = 4096;
public String URL;
private DatagramSocket udpSocket;
private DatagramPacket packet;
String text;
static boolean bol =false;
OnHeadlineSelectedListener mCallback;
int i=2;
private void listenAndWaitAndThrowIntent() throws Exception {
byte[] message = new byte[5120];
if(udpSocket == null || udpSocket.isClosed()){
udpSocket = new DatagramSocket(port);
}
packet = new DatagramPacket(message, message.length);
//Thread.sleep(5000);
Log.i("UDP client: ", "about to wait to receive");
udpSocket.receive(packet);
String text = new String(message, 0, packet.getLength());
this.text = text;
Log.d("Received data", text);
packet.getPort();
URL = packet.getAddress().toString().replace("/", "");
Log.d("Address", String.valueOf(packet.getAddress()));
Log.d("Port", String.valueOf(packet.getPort()));
udpSocket.close();
}
Thread UDPBroadcastThread;
void startListenForUDPBroadcast(){
UDPBroadcastThread = new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
while (true) {
try {
listenAndWaitAndThrowIntent();
bol = lm.addLamp(URL,text);
mCallback = (OnHeadlineSelectedListener) MainActivity.getContextOfApplication();
mCallback.onArticleSelected(i);
Thread.sleep(1000);
} catch (Exception e) {
Log.i("UDP", e.getMessage());
}
}
}
});
UDPBroadcastThread.start();
}
private void stopListen() {
udpSocket.close();
}
@Override
public void onDestroy() {
stopListen();
}
/*public int onStartCommand(Intent intent, int flags, int startId){
startListenForUDPBroadcast();
Log.i("UDP", "Service Started");
return START_STICKY;
}*/
@Override
public void onCreate(){
super.onCreate();
startListenForUDPBroadcast();
}
@Override
public IBinder onBind(Intent intent) {
// We don't provide binding, so return null
Log.i("UDP", "Service Started");
return myBinder;
}
public interface OnHeadlineSelectedListener {
void onArticleSelected(int position);
}
public class MyLocalBinder extends Binder {
UDPService getService() {
return UDPService.this;
}
}
}
Главный Activity
иметь Listview
, метод addLamp(URL,text)
добавляет Lamp
к списку. Мне нужно обновить основной вид деятельности, когда бол возвращается true
, Я звоню notifyDataSetChanged()
освежить listView
, Код работает потому что при вызове onCreate()
в основной деятельности, которые содержат notifyDataSetChanged()
, чтобы обновить список с lamp
что я создал с addLamp
, Моя проблема в том, что Service
не выходит из looper
, Код для addLamp
является:
public class LampManager extends AppCompatActivity {
private static final LampManager ourInstance = new LampManager();
private List<Lamp> lista = new ArrayList();
Context applicationContext = MainActivity.getContextOfApplication();
public boolean addLamp(String URL, String name) throws InterruptedException{
String ip = URL.replace("/", "");
Log.i("UDP", "Messagio ricevuto!");
boolean b = true;
System.out.println(getLamps().size());
Lamp l =null;
try {
for(int i=0; i<getLamps().size();i++) {
System.out.println(getLamp(i).getURL());
System.out.println(getLamp(i).getURL());
char c = name.charAt(name.length()-1);
Thread.sleep(5000);
if (lista.get(i).getName().equals(name)) {
b = false;
}else if(c>='0' && c<='9' && name.contains("LAMP_"))
b=true;
else
b=false;
}
if(b){
System.out.println("Thread.sleep(5000)");
l = new Lamp(URL, name);
new TcpClient(l, applicationContext).execute();
lista.add(l);
return b;
}
}catch (Exception e){
Log.d("ERR",e.getMessage());
}
return b;
}
}
Пока код для lamp
является:
public class Lamp extends AppCompatActivity {
private String name;
private int rgb;
private Bitmap image;;
private int intensity;
private Boolean state;
public String URL;
//save the context recievied via constructor in a local variable
Context applicationContext = MainActivity.getContextOfApplication();
public Lamp( String URL, String name){
this.name=name;
this.URL=URL;
SharedPreferences sh = PreferenceManager.getDefaultSharedPreferences(applicationContext);
SharedPreferences.Editor editor = sh.edit();
setName(name);
editor.putString(getName()+":URL", URL);
editor.apply();
}
1 ответ
Используйте интерфейсы
Во-первых, определите интерфейс для вашего класса обслуживания:
// Container Activity must implement this interface
public interface OnHeadlineSelectedListener {
public void onArticleSelected(int position);
}
Теперь фрагмент может доставлять сообщения в действие, вызывая метод onArticleSelected() (или другие методы в интерфейсе), используя экземпляр mCallback интерфейса OnHeadlineSelectedListener.
Затем на активность:
public static class MainActivity extends Activity
implements HeadlinesFragment.OnHeadlineSelectedListener{
...
public void onArticleSelected(int position) {
// The user selected the headline of an article from the HeadlinesFragment
// Do something here to display that article
}
}
Удачи:D