Конечно! Нет причин, по которым вы не можете иметь приложение только с услугой. ... и нет необходимости входить в AIDL, если вы этого не хотите.
Проблема в том, как заставить приложение запускаться. Когда вы создаете приложение с активностью, вы добавляете в манифест фильтр Intent, который запускает активность с Launcher. Если нет никакой активности, вам придется найти другой способ ее запуска.
Это легко сделать. Просто запустите намерение от одной из ваших других программ, например:
startService(new Intent("my.service.intent"));
... где служба зарегистрирована ваш манифест, например:
<service android:name=".SomeService" >
<intent-filter>
<action android:name="my.service.intent"/>
</intent-filter>
Вы могли бы используйте это намерение передать Parcelable параметры в службу, и служба может ответить, передавая намерения обратно.
Конечно, startService и broadcastIntent немного неуклюжи, если вам действительно нужен сложный API между приложениями и вашим сервисом. Если вам нужно что-то более богатое, вы захотите посмотреть в AIDL и связанную службу.
Отредактировано для добавления Intent Filter
Попробуйте это (см. Комментарии к коду для пояснений):
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner input = new Scanner(System.in);
int[] num = new int[100];
int i = 0;
while (i < 100) { // Check if the array is already full
System.out.print("Enter 0 to Exit or enter the integers between 1 and 50 (Input #" + (i + 1) + ") : ");
int value = input.nextInt();
if (value == 0) {
break;
}
if (value < 1 || value > 50) { // check if input is between 1 and 50
System.out.println("Input is not between 1 and 50");
} else {
num[i] = value;
System.out.println();
}
i++;
}
System.out.println();
System.out.println("Result: ");
for (int j = 0; j < i; j++) {
int n = 0;
boolean isAlreadyPrinted = false; // flag to check if will be printed or not
for (int k = 0; k < i; k++) {
if (num[j] == num[k]) {
if (j > k) { // this means that the same value is already found and printed
isAlreadyPrinted = true;
}
n++;
}
}
if (!isAlreadyPrinted) {
System.out.println(num[j] + " occurs " + n + " times");
}
}
}
}
Проблема с вашим циклом.
Вы не должны увеличивать значение j до i. Вот почему «1 встречается 2 раза» печатает дважды. Что вам нужно сделать, так это проверить, что значение определенного индекса массива встречалось несколько раз перед выполнением части печати.
public static<T> T[] subArray(T[] array, int beg, int end) {
return Arrays.copyOfRange(array, beg, end + 1);
}
public static boolean hasDuplicateValues (int[] array, int value )
{
boolean result = false ;
int count = 0 ;
for (int i=0 ; i< array.length; i++)
{
if(array[i] == value)
{
count = count+1 ;
}
}
if(count > 1)
{
result = true;
}
return result;
}
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
int[] num = new int[100];
int i = 0;
System.out.print("Enter the integers between 1 and 50: ");
num[i] = input.nextInt();
while(num[i] != 0){
i++;
num[i] = input.nextInt();
}
for(int j=0;j<i;j++){
int n = 0;
for(int k=0;k<i;k++){
if(num[j] == num[k]){
n++;
}
}
int[] subarray = subArray(num, 0, i);
boolean isDuplicate = hasDuplicateValues (subarray , num[i] )
if(isDuplicate == false )
{
System.out.println(num[j] + " occurs " + n + " times");
}
}
}