3

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

在我的活动中,方法名称是 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";
    }
}
4

4 回答 4

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
    }
}

希望有帮助。

于 2012-07-09T06:51:07.700 回答
0

我猜你走错路了。如果不想启动Activity,只想调用它的方法,最好把这个方法推出Activity。有很多职责的类被认为是一个糟糕的设计。考虑使用 Application类。

于 2012-07-09T06:55:29.637 回答
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;
  }
 };
}
于 2015-06-08T07:13:13.840 回答
0

像这样编写您的活动和服务类:

我的活动.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();

    }
}

我的服务.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;
    }

}
于 2021-04-29T12:52:18.987 回答