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

アクティビティからのサービスを処理する方法は3つあります。

  • IBinderの実装
  • メッセンジャーの使用
  • AIDLの使用

IMHOがバインドサービスを使用する最も簡単な方法

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

アクティビティとサービスのクラスを次のように記述します。

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

}
于 2021-04-29T12:52:18.987 に答える