2012-07-09 76 views
2

如何在当时调用方法从服务到活动。我想只使用定时器函数和处理函数来调用服务.am。如何从服务中调用活动方法

在我的活动方法名是SAVEDATA(),我想CAL此功能

服务

public class MyService extends Service 
{ 
    @Override 
    public IBinder onBind(Intent intent) 
    { 
     return null; 
    } 

    @Override 
    public void onCreate() 
    { 
     Log.d(TAG, "onCreate"); 
    } 

    @Override 
    public void onDestroy() 
    { 
     Log.d(TAG, "onDestroy"); 
    } 

    public void onStart(Intent intent, int startid) 
    { 
     Timer mTimer = new Timer(user); 
     mTimer.scheduleAtFixedRate(new mainTask(), 5000,60000);//1 hour=3600 s 

    } 

    private class mainTask extends TimerTask 
    { 
     public void run() 
     { 
      toastHandler.sendEmptyMessage(0); 
     } 
    } 


    private final Handler toastHandler = new Handler() 
    { 
     public void handleMessage(Message msg) 
     { 
       Intent myIntent = new Intent(getBaseContext(),StorageHelper.class); 
       myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       startActivity(myIntent);//here i start the activity but i need to acces the particular method only. 

     } 
    };  

} 

更新

活动

public class StorageHelper extends Activity 
{ 
    final DBAdapter1 database=new DBAdapter1(this); 

MessageCount objmsgCount=new MessageCount(); 
String msgCount; 
int count; 
String []tokens=null; 
String notify=null; 
int userid=71; 


public String savedata() 
    { 
     msgCount=objmsgCount.getMessageCount(); 
     { 
      try { 
       database.open(); 
      } catch (SQLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      } 
        long id=database.insert(71,4,"yes"); 
        database.close(); 

     return "success"; 
    } 
} 
+0

我的问题是CAL的方法,而不是在我的活动中启动活动 – JavaH 2012-07-09 06:40:47

+0

我插入,删除并更新值,所以我需要cal方法separetly – JavaH 2012-07-09 06:52:39

+0

你声明StorageHelper活动在你的清单文件? – 2012-07-09 06:57:03

回答

0

这是一个很好的问题,可能以前曾经被问过很多次,但是有一个让我难以置信。

您有几种选择,其中最简单的是与你的活动注册一个监听器,但是这需要你实现onBind(意图)这样你就可以从活动连接到服务,所以你可以注册监听器。

下面的例子展示了如何做到这一点,一旦你已经注册的活动作为一个听者setServiceClient(ExampleServiceClient)那么服务可以调用方法exampleServiceClientMethod()上的活动。

您会注意到我在注册客户端时使用WeakReference,请务必在调用添加到ExampleServiceClient的任何方法时检查是否仍然有引用。

public class ExampleService extends Service { 

    public interface ExampleServiceClient { 
     void exampleServiceClientMethod(); 
    } 

    private WeakReference<ExampleServiceClient> mClient; 

    public void setServiceClient(ExampleServiceClient client) { 
     if(client == null) { 
      mClient = null; 
      return; 
     } 

     mClient = new WeakReference<ExampleServiceClient>(client); 
    } 

    public class ExampleBinder extends Binder { 
     ExampleService getService() { 
      return ExampleService.this; 
     } 
    } 

    private IBinder mBinder = new ExampleBinder(); 

    @Override 
    public IBinder onBind(Intent intent) { 
     return mBinder; 
    } 
} 

您的活动:

public class ExampleServiceActivity extends Activity implements ExampleServiceClient { 

    private ExampleServiceConnection mServiceConnection = new ExampleServiceConnection(); 
    private ExampleService mService = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     bindService(new Intent(this, ExampleService.class), mServiceConnection, BIND_AUTO_CREATE); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 

     unbindService(mServiceConnection); 
    } 


    class ExampleServiceConnection implements ServiceConnection { 

     public void onServiceConnected(ComponentName name, IBinder service) { 
      mService = ((ExampleBinder)service).getService(); 

      mService.setServiceClient(ExampleServiceActivity.this); 
     } 

     public void onServiceDisconnected(ComponentName name) { 
      mService.setServiceClient(null); 
      mService = null; 

     } 
    } 


    public void exampleServiceClientMethod() { 
     // TODO Auto-generated method stub 
    } 
} 

希望有所帮助。

+0

我更新我的活动代码从我的服务类我需要cal的savedata函数 – JavaH 2012-07-09 07:00:53

+0

您的问题的答案是在我的示例中,您需要将您的活动与您的服务,这是我的例子做了什么。 – 2012-07-09 07:06:48

+0

从你的例子中你从活动中调用什么方法?它很难理解 – JavaH 2012-07-09 07:10:18

0

我想你错了。如果您不想启动Activity,但只想调用其方法,则最好将此方法推出“活动”。有很多责任的班级被认为是不好的设计。 也考虑使用Application类。

0

有三种方法可以处理来自Activity的服务。

  • 的IBinder实施
  • 使用信使
  • 使用AIDL

最简单的方式恕我直言,是使用绑定服务

public class Server extends Service{ 

IBinder mBinder = new LocalBinder(); 

@Override 
public IBinder onBind(Intent intent) { 
    return mBinder; 
} 

public class LocalBinder extends Binder { 
    public Server getServerInstance() { 
    return Server.this; 
    } 
} 

public String getTime() { 
    SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    return mDateFormat.format(new Date()); 
} 
} 



package com.example.bindservice.binder; 

import android.app.Activity; 
import android.content.ComponentName; 
import android.content.Intent; 
import android.content.ServiceConnection; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.example.bindservice.binder.Server.LocalBinder; 

public class Client extends Activity { 

boolean mBounded; 
Server mServer; 
TextView text; 
Button button; 

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     text = (TextView)findViewById(R.id.text); 
     button = (Button) findViewById(R.id.button); 
     button.setOnClickListener(new OnClickListener() { 

    public void onClick(View v) { 
    text.setText(mServer.getTime()); 
    } 
    }); 
    } 

@Override 
protected void onStart() { 
    super.onStart(); 
    Intent mIntent = new Intent(this, Server.class); 
     bindService(mIntent, mConnection, BIND_AUTO_CREATE); 
}; 

ServiceConnection mConnection = new ServiceConnection() { 

    public void onServiceDisconnected(ComponentName name) { 
    Toast.makeText(Client.this, "Service is disconnected", 1000).show(); 
    mBounded = false; 
    mServer = null; 
    } 

    public void onServiceConnected(ComponentName name, IBinder service) { 
    Toast.makeText(Client.this, "Service is connected", 1000).show(); 
    mBounded = true; 
    LocalBinder mLocalBinder = (LocalBinder)service; 
    mServer = mLocalBinder.getServerInstance(); 
    } 
}; 

@Override 
protected void onStop() { 
    super.onStop(); 
    if(mBounded) { 
    unbindService(mConnection); 
    mBounded = false; 
    } 
}; 
} 
相关问题