Служба привязки Android для каждого элемента ListView или RecyclerView

#java #android #android-recyclerview #android-listview #android-service

#java #Android #android-RecyclerView #android-listview #android-сервис

Вопрос:

Я создаю представление списка, как показано ниже. Я изучаю Android и получил поддержку.

 ---------------------------------------
File Name 1     0%      Download Button
---------------------------------------
File Name 2     0%      Download Button
---------------------------------------
File Name 3     0%      Download Button
---------------------------------------
 

У меня есть программа, которая использует привязанный сервис и счетчик в нем, который подсчитывает от 1% до 100% после нажатия кнопки.

Теперь, как я могу использовать эту программу для каждого элемента представления списка.

ПРИМЕЧАНИЕ: для этого я хочу использовать связанную службу.

В приведенной ниже программе есть кнопка запуска службы, которая запускает связанную службу и отправляет brodcast в пользовательский интерфейс, чтобы показать прогресс от 1% до 100%. Я должен сделать это для каждого элемента в моем listview или recyclerview.

В моем приведенном выше макете, когда я нажимаю кнопку загрузки, он должен запускать привязанный сервис и показывать прогресс.

activity_main.xml

 <Button
    android:id="@ id/button"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="start_service"
    android:text="Start" />

<TextView
    android:id="@ id/showCount"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="TextView" />
 

MainActivity.java

 public class MainActivity extends AppCompatActivity {
    TextView showCount;
    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        showCount = findViewById(R.id.showCount);

        Intent intent = new Intent(MainActivity.this, MyService.class);
        bindService(intent, sConnection, BIND_AUTO_CREATE);

    }

    BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String s1 = intent.getStringExtra("DATAPASSED");
            showCount.setText(s1);
        }
    };

    public void start_service(View view) {
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(MyService.MY_ACTION);
        registerReceiver(broadcastReceiver, intentFilter);

        myService.startCounting();

        super.onStart();
    }


    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart: ");
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (isBind) {
            unbindService(sConnection);
            isBind = false;
            Log.d(TAG, "onStop: ");
        }
    }

    MyService myService;
    boolean isBind = false;
    public ServiceConnection sConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            MyService.LocalBinder binder = (MyService.LocalBinder) iBinder;
            myService = binder.getService();
            isBind = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            isBind = false;
        }
    };

}
 

MyService.java

 public class MyService extends Service {
    private static final String TAG = "MyService";
    static final String MY_ACTION = "MY_ACTION";

    public static final String CHANNEL_ID = "CHANNEL_ID";

    public final IBinder binder = new LocalBinder();

    public class LocalBinder extends Binder {
        MyService getService() {
            return MyService.this;
        }
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG, "onBind: start gn");
        return binder;
    }

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

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        String input = "Supper Text";

        Intent notificationIntent = new Intent(this, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this,0, notificationIntent, 0);

        Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setContentTitle("Notification Title")
                .setContentText(input)
                .setSmallIcon(R.drawable.notification_icon)
                .setContentIntent(pendingIntent)
                .build();

        startForeground(0, notification);

        return START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        Log.d(TAG, "onDestroy: ");
        super.onDestroy();
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.d(TAG, "onUnbind: ");
        return super.onUnbind(intent);
    }

    @Override
    public void onRebind(Intent intent) {
        Log.d(TAG, "onRebind: ");
        super.onRebind(intent);
    }

    public void startCounting() {
        if (!running) {
            running = true;
            new GenerateNumber().start();
        }
    }

    public void stopCounting() {
        if (running) {
            running = false;
        }
    }

    int generatedNumber;
    boolean running;

    class GenerateNumber extends Thread {
        GenerateNumber() {}

        @Override
        public void run() {

            while (running) {
                generatedNumber  ;
                Log.d(TAG, "run: "   generatedNumber);
                try {

                    Intent intent = new Intent();
                    intent.setAction(MY_ACTION);
                    intent.putExtra("DATAPASSED", String.valueOf(generatedNumber));
                    sendBroadcast(intent);
                    Thread.sleep(500);

                    if (generatedNumber >= 100) {
                        running = false;
                    }

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}