如何在此时调用方法从服务到活动。我想只使用定时器函数和处理程序从服务.am中获取特定方法。
在我的Activity中,方法名称是savedata(),我想要调用此函数
服务
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 :(得分:1)
这是一个很好的问题,可能之前曾多次被问到,但是一个让我难以接受的问题。
您有几个选项,最简单的方法是在您的活动中注册一个监听器,但这需要您实现 onBind(Intent),以便您可以从活动连接到服务,你可以注册听众。
以下示例向您展示如何执行此操作,一旦您将活动注册为具有 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
}
}
希望有所帮助。
答案 1 :(得分:0)
我猜你的方向错了。如果您不想启动Activity,但只想调用其方法,则最好将此方法推出Activity。有很多责任的班级被认为是一个糟糕的设计。 考虑使用Application类。
答案 2 :(得分:0)
有三种方法可以处理来自Activity的服务。
最简单的方法是使用绑定服务
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;
}
};
}
答案 3 :(得分:0)
像这样编写您的活动和服务类:
MyActivity.java
package com.rdc;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;
public class MyActivity extends Activity {
static MyActivity instance;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
instance = this;
Intent myIntent = new Intent(getBaseContext(), MyService.class);
startService(myIntent);
}
public void showToast() {
Toast.makeText(getBaseContext(), "called from ervice", 1).show();
}
}
MyService.java
package com.rdc;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
public class MyService extends Service {
@Override
public IBinder onBind(Intent i) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
Log.v("Debug", "Service has been Created..");
// code to execute when the service is first created
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.v("Debug", "Service has been Started..");
Toast.makeText(getBaseContext(), "Service has been Started..",
Toast.LENGTH_SHORT).show();
// getting the static instance of activity
MyActivity activity = MyActivity.instance;
if (activity != null) {
// we are calling here activity's method
activity.showToast();
}
return START_STICKY;
}
}