অ্যান্ড্রয়েডে পরিষেবা শুরু করুন


115

যখন কোনও নির্দিষ্ট ক্রিয়াকলাপ শুরু হয় আমি কোনও পরিষেবাতে কল করতে চাই। সুতরাং, এখানে পরিষেবা শ্রেণি:

public class UpdaterServiceManager extends Service {

    private final int UPDATE_INTERVAL = 60 * 1000;
    private Timer timer = new Timer();
    private static final int NOTIFICATION_EX = 1;
    private NotificationManager notificationManager;

    public UpdaterServiceManager() {}

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {
        // Code to execute when the service is first created
    }

    @Override
    public void onDestroy() {
        if (timer != null) {
            timer.cancel();
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startid) {
        notificationManager = (NotificationManager) 
                getSystemService(Context.NOTIFICATION_SERVICE);
        int icon = android.R.drawable.stat_notify_sync;
        CharSequence tickerText = "Hello";
        long when = System.currentTimeMillis();
        Notification notification = new Notification(icon, tickerText, when);
        Context context = getApplicationContext();
        CharSequence contentTitle = "My notification";
        CharSequence contentText = "Hello World!";
        Intent notificationIntent = new Intent(this, Main.class);
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                notificationIntent, 0);
        notification.setLatestEventInfo(context, contentTitle, contentText,
                contentIntent);
        notificationManager.notify(NOTIFICATION_EX, notification);
        Toast.makeText(this, "Started!", Toast.LENGTH_LONG);
        timer.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {
                // Check if there are updates here and notify if true
            }
        }, 0, UPDATE_INTERVAL);
        return START_STICKY;
    }

    private void stopService() {
        if (timer != null) timer.cancel();
    }
}

এবং এখানে আমি এটি কল কিভাবে:

Intent serviceIntent = new Intent();
serviceIntent.setAction("cidadaos.cidade.data.UpdaterServiceManager");
startService(serviceIntent);

সমস্যা হ'ল কিছুই হয় না। উপরের কোড ব্লকটিকে ক্রিয়াকলাপের শেষে বলা হয় onCreate। আমি ইতিমধ্যে ডিবাগ করেছি এবং কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হচ্ছে না।

কোন ধারণা?


1
টাইমারদের সাথে যত্নবান - এএফআইএকি যখন আপনার পরিষেবাটি ফ্রি রিসোর্সে বন্ধ হয়ে যায় তখন এই টাইমারটি আবার চালু হবে না যখন পরিষেবাটি আবার চালু হবে। আপনি ঠিকই START_STICKYপরিষেবাটি পুনরায় চালু করবেন, তবে কেবলমাত্র অনক্রিটকে ডাকা হবে এবং টাইমার ভের পুনরায় আরম্ভ করা হবে না। START_REDELIVER_INTENTএটিকে ঠিক করার জন্য আপনি অ্যালার্ম পরিষেবা বা এপিআই 21 জব শিডিয়ুলারের সাথে খেলতে পারেন ।
জর্জি

আপনি যদি ভুলে গেছেন, আপনি <service android:name="your.package.name.here.ServiceClass" />অ্যাপ্লিকেশন ট্যাগের মধ্যে অ্যান্ড্রয়েড ম্যানিফেস্টে পরিষেবাটি নিবন্ধভুক্ত করেছেন তা নিশ্চিত করুন ।
জাপেথ ওঙ্গেরি - ইঙ্কালিমেভা

উত্তর:


278

সম্ভবত আপনার ম্যানিফেস্টে পরিষেবাটি আপনার কাছে নেই বা এটির সাথে <intent-filter>আপনার ক্রিয়া মেলে না matches লগগ্যাট (পরীক্ষা করে adb logcat, ডিডিএমএস, বা একিপ্সিতে ডিডিএমএসের দৃষ্টিভঙ্গি) পরীক্ষা করাতে কিছু সতর্কতা অবলম্বন করা উচিত যা সাহায্য করতে পারে।

সম্ভবত, আপনার মাধ্যমে পরিষেবাটি শুরু করা উচিত:

startService(new Intent(this, UpdaterServiceManager.class));

1
আপনি কিভাবে ডিবাগ করতে পারেন? কখনই আমার পরিষেবা বলে না, আমার ডিবাগ কিছুই দেখায় না
বিতরণ করুন

লগ.এ ট্যাগগুলির একটি শিটোন যেকোন জায়গায় যুক্ত করুন: আপনি পরিষেবাটি চালু করার আগে, পরিষেবা উদ্দেশ্যটির ফলাফল, পরিষেবা শ্রেণীর ভিতরে যেখানে এটি ভ্রমণ করবে (অনক্রিট, অন্টাস্ট্রয়, যে কোনও এবং সমস্ত পদ্ধতি)।
জো

এটি আমার অ্যাপ্লিকেশনগুলির জন্য অ্যান্ড্রয়েড এসডিকে 26+ এ কাজ করে তবে ডোজ অ্যান্ড্রয়েড এসডিকে 25 বা তার চেয়ে কম নয়। কোন সমাধান আছে?
মাহিদুল ইসলাম

@ মাহিদুল ইসলাম: আমি আপনাকে সুপারিশ করছি যে আপনি একটি পৃথক স্ট্যাক ওভারফ্লো প্রশ্ন জিজ্ঞাসা করুন, যেখানে আপনি আপনার সমস্যা এবং লক্ষণগুলি আরও বিস্তারিতভাবে ব্যাখ্যা করে একটি ন্যূনতম প্রজননযোগ্য উদাহরণ প্রদান করতে পারেন ।
কমন্সওয়্যার

-: @CommonsWare আমি ইতিমধ্যে একটি প্রশ্ন এবং যে এর জিজ্ঞাসা stackoverflow.com/questions/49232627/...
Mahidul ইসলাম

81
startService(new Intent(this, MyService.class));

শুধু এই লাইনটি লেখাই আমার পক্ষে যথেষ্ট ছিল না। পরিষেবা এখনও কার্যকর হয়নি। মেনিফেস্টে পরিষেবা নিবন্ধনের পরে সমস্ত কিছুই কাজ করেছিল

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >

    ...

    <service
        android:name=".MyService"
        android:label="My Service" >
    </service>
</application>

1
অ্যান্ড্রয়েড কোডারজপায়নেস / ইমপ্লিমেন্ট-সার্ভিস- অ্যান্ড্রয়েডে পরিষেবাদি সম্পর্কিত সমস্ত কিছু জানার সেরা উদাহরণ এবং দেরী হওয়ার জন্য দুঃখিত
জগজিৎ সিং

55

পরিষেবা চালু করার জন্য জাভা কোড :

ক্রিয়াকলাপ থেকে পরিষেবা শুরু করুন :

startService(new Intent(MyActivity.this, MyService.class));

টুকরা থেকে পরিষেবা শুরু করুন :

getActivity().startService(new Intent(getActivity(), MyService.class));

মাই সার্ভিস.জভা :

import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {

    private static String TAG = "MyService";
    private Handler handler;
    private Runnable runnable;
    private final int runTime = 5000;

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "onCreate");

        handler = new Handler();
        runnable = new Runnable() {
            @Override
            public void run() {

                handler.postDelayed(runnable, runTime);
            }
        };
        handler.post(runnable);
    }

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

    @Override
    public void onDestroy() {
        if (handler != null) {
            handler.removeCallbacks(runnable);
        }
        super.onDestroy();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

    @SuppressWarnings("deprecation")
    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        Log.i(TAG, "onStart");
    }

}

প্রকল্পের ম্যানিফেস্ট ফাইলটিতে এই পরিষেবাটি সংজ্ঞায়িত করুন:

ম্যানিফেস্ট ফাইলটিতে ট্যাগের নীচে যুক্ত করুন:

<service android:enabled="true" android:name="com.my.packagename.MyService" />

সম্পন্ন


7
যখন আমি একই প্যাকেজে ক্রিয়াকলাপ এবং পরিষেবাদিগুলি ছেড়ে দিই তখন এটি কতটা উন্নতি করে? এর আগে কখনও শুনিনি।
ওয়ানওয়ার্ল্ড 13

সম্ভবত তারা খুব অস্পষ্ট শিথিল অর্থে পারফরম্যান্স বোঝায়, রান গতির বিষয়ে নয়?
অনুবিয়ান নুব

3

আমি এটিকে আরও গতিশীল করতে চাই

Class<?> serviceMonitor = MyService.class; 


private void startMyService() { context.startService(new Intent(context, serviceMonitor)); }
private void stopMyService()  { context.stopService(new Intent(context, serviceMonitor));  }

ম্যানিফেস্ট ভুলবেন না

<service android:enabled="true" android:name=".MyService.class" />

1
Intent serviceIntent = new Intent(this,YourActivity.class);

startService(serviceIntent);

ম্যানিফিস্টে পরিষেবা যুক্ত করুন

<service android:enabled="true" android:name="YourActivity.class" />

ওরিওতে পরিষেবা চালানোর জন্য এবং বৃহত্তর ডিভাইসগুলি স্থল পরিষেবা এবং ব্যবহারকারীকে বিজ্ঞপ্তি প্রদর্শনের জন্য ব্যবহার করে

বা পটভূমি রেফারেন্স অবস্থান আপডেটের জন্য জিওফেন্সিং পরিষেবা ব্যবহার http://stackoverflow.com/questions/tagged/google-play-services

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.