Your solution is not working, because progressArray is an instance variable and while calling
ListViewLoader lvl = new ListViewLoader
which creates new instance with progressArray set to default value (null in that case). Making progressArray static can be a fast solution, but be aware you will highly depend on order in which activity and service will access that array and it may be reset when your activity is destroyed by system. I'm strongly discouraging you from doing that. Instead, please consider extending Application class and implement list initialisation / access there, like:
public class MyApplication extends Application {
public String progressArray[][] = new String[3][3];
}
Then declare it in AndroidManifest like:
<application
android:name=".MyApplication"
android:label="@string/app_name"
android:icon="@drawable/icon">
Then both, from your activities and services you can get that by calling
((MyApplication) getApplication()).progressArray
This is the only way to share state between activities and services across one application I'm aware of, neither involving sending messages back and forth to keep state consistent (which can be nontrivial task) nor using singletons (which is anti-pattern as you probably know).
But please keep in mind, that need of sharing mutable data in that manner may be a hint, that your design needs an improvement.