如何提供后台服务?

时间:2016-06-13 09:34:51

标签: java android android-service

我的应用程序关闭时需要执行一些任务。 我为此做了一个服务并尝试了很多东西,但我没有取得好成绩。

如果有人有教程或要遵循的路径,那就太棒了

这是我的服务:

public class TrackersImporter extends Service {
    private static TrackersImporter instance;
    private static long refreshDelay = 1; // Minutes

    private Looper mServiceLooper;
    private ServiceHandler mServiceHandler;

    private boolean isInit = false;
    public ArrayList<Tracker> trackers = new ArrayList<>();

    public static TrackersImporter getInstance(){
        if (instance == null)
            instance = new TrackersImporter();
        return instance;
    }

    @Override
    public void onCreate() {
        HandlerThread thread = new HandlerThread("TrackersImporter",
                Process.THREAD_PRIORITY_BACKGROUND);
        thread.start();

        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        try {
            Toast.makeText(this, "onStartCommand", Toast.LENGTH_SHORT).show();
            Message message = mServiceHandler.obtainMessage();
            message.arg1 = startId;
            mServiceHandler.sendMessage(message);
        } catch (Exception e) {
            Log.w("TrackersImporter", e.getMessage());
        }
        return START_STICKY;
    }

    public void addTracker(Tracker tracker) {
        trackers.add(tracker);
    }

    protected void showToast(final String msg){
        Handler handler = new Handler(Looper.getMainLooper());
        handler.post(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
            }
        });
    }

    // Object responsible for
    private final class ServiceHandler extends Handler {

        public ServiceHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            addTracker(Runkeeper.getInstance(MainActivity.getActivity()));
            addTracker(Strava.getInstance(MainActivity.getActivity()));
            startImport(MainActivity.getActivity().getBaseContext(), MainActivity.getActivity().getAppUser(), trackers);
            stopSelf(msg.arg1);
        }

        /**
         * Perform data imports.
         * Imports are performed only 1 time.
         * Additional calls to this method are equivalent to no-op.
         * Call init() then performImport() for each TrackerImportable
         * @param user user receiving the datas
         */
        public void startImport(Context context, User user, ArrayList<Tracker> trackers) {
            Context ctx = MainActivity.getActivity().getApplicationContext();
            LocalDateTime now = new LocalDateTime();

            if (Preferences.getPref(ctx, "tracker_import_date") == "")
                Preferences.setPref(ctx, "tracker_import_date", now.toString());

            LocalDateTime past = LocalDateTime.parse(Preferences.getPref(ctx, "tracker_import_date"));
            long duration = new Duration(past.toDateTime(), now.toDateTime()).getStandardMinutes();

            if (isInit)
                return;
            if (duration > refreshDelay) {
                Preferences.setPref(ctx, "tracker_import_date", now.toString());
                for (Tracker tracker : trackers) {
                    if (tracker.isEnabled() && Tracker.isUserEnabled(context, tracker.getName())) {
                        tracker.init();
                        tracker.performImport(user);
                    }
                }
            }

            isInit = true;
        }
    }
}

这是我的mainActivity

public class MainActivity extends BaseActivity {
    ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

       ...

        if (ConnectivityUtil.isConnected(this.getApplicationContext())) {
            initGoogleFit();
            initTrackers(appUser);
        }
    }

    private void initTrackers(User user) {
        Intent trackersIntentService = new Intent(this, TrackersImporter.class);
        trackersIntentService.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        this.startService(trackersIntentService);
    }

    @Override
    protected void onResume() {
        ...

        if (ConnectivityUtil.isConnected(this.getApplicationContext())) {
            initTrackers(appUser);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

First Create one launcher Activity which is like your Main Activity.
In Activity "onCreate" Method you need to start Service and Do Some thing if you wont in Service "onStartCommand" Method.


public class MainActivity extends Activity {
    ArrayList<Integer> list;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

         startService(new Intent(MainActivity.this,TrackersImporter.class);

}

public class TrackersImporter extends Service {
 @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

          // do something 
       Log.v(TAG ,"Service is started");
}
}

And also Register this Service at manifest.xml like this. 
   <service android:name=".TrackersImporter"></service>

if you like stop service
  stopService(new Intent(MainActivity.this,TrackersImporter.class);